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 nil
for 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())