Get day of week using NSDate Get day of week using NSDate swift swift

Get day of week using NSDate


Swift 3 & 4

Retrieving the day of the week's number is dramatically simplified in Swift 3 because DateComponents is no longer optional. Here it is as an extension:

extension Date {    func dayNumberOfWeek() -> Int? {        return Calendar.current.dateComponents([.weekday], from: self).weekday     }}// returns an integer from 1 - 7, with 1 being Sunday and 7 being Saturdayprint(Date().dayNumberOfWeek()!) // 4

If you were looking for the written, localized version of the day of week:

extension Date {    func dayOfWeek() -> String? {        let dateFormatter = DateFormatter()        dateFormatter.dateFormat = "EEEE"        return dateFormatter.string(from: self).capitalized         // or use capitalized(with: locale) if you want    }}print(Date().dayOfWeek()!) // Wednesday


What you are looking for (if I understand the question correctly) is NSCalendarUnit.CalendarUnitWeekday. The corresponding property of NSDateComponents is weekday.

Note also that your date format is wrong (thefull specification can be found here: http://unicode.org/reports/tr35/tr35-6.html).

The function can be simplified slightly, using automatic type inference, also you use variables a lot where constants are sufficient.In addition, the function should return an optional which is nilfor an invalid input string.

Updated code for Swift 3 and later:

func getDayOfWeek(_ today:String) -> Int? {    let formatter  = DateFormatter()    formatter.dateFormat = "yyyy-MM-dd"    guard let todayDate = formatter.date(from: today) else { return nil }    let myCalendar = Calendar(identifier: .gregorian)    let weekDay = myCalendar.component(.weekday, from: todayDate)    return weekDay}

Example:

if let weekday = getDayOfWeek("2014-08-27") {    print(weekday)} else {    print("bad input")}

Original answer for Swift 2:

func getDayOfWeek(today:String)->Int? {    let formatter  = NSDateFormatter()    formatter.dateFormat = "yyyy-MM-dd"    if let todayDate = formatter.dateFromString(today) {        let myCalendar = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)!        let myComponents = myCalendar.components(.Weekday, fromDate: todayDate)        let weekDay = myComponents.weekday        return weekDay    } else {        return nil    }}


If you want the full "Sunday", "Monday", "Tuesday", "Wednesday" etc.

EDIT: There's actually a built in format that returns localized day names:

extension NSDate {    func dayOfTheWeek() -> String? {                let dateFormatter = NSDateFormatter()        dateFormatter.dateFormat = "EEEE"        return dateFormatter.stringFromDate(self)    }}

My previous solution (for English only):

extension NSDate {    func dayOfTheWeek() -> String? {        let weekdays = [            "Sunday",            "Monday",            "Tuesday",            "Wednesday",            "Thursday",            "Friday",            "Saturday"        ]        let calendar: NSCalendar = NSCalendar.currentCalendar()        let components: NSDateComponents = calendar.components(.Weekday, fromDate: self)        return weekdays[components.weekday - 1]    }}

You don't need to unwrap calendar and components, they are guaranteed by the foundation framework.

Usage:

print(myDate.dayOfTheWeek())