使用NSDate获取星期几

boi*_*kan 75 nsdate nscalendar swift

我创建了一个方法,该方法应该以"YYYY-MM-DD"形式接收一个字符串并吐出一个int,表示相对于它所在周的日期位置(无论它是否在几个月之间重叠).所以例如星期日= 1星期一= 2,依此类推.

这是我的代码:

    func getDayOfWeek(today:String)->Int{

    var formatter:NSDateFormatter = NSDateFormatter()
    formatter.dateFormat = "YYYY-MM-DD"
    var todayDate:NSDate = formatter.dateFromString(today)!
    var myCalendar:NSCalendar = NSCalendar(calendarIdentifier: NSGregorianCalendar)
    var myComponents = myCalendar.components(NSCalendarUnit.WeekdayOrdinalCalendarUnit, fromDate: todayDate)
    var weekDay = myComponents.weekdayOrdinal
    return weekDay
}
Run Code Online (Sandbox Code Playgroud)

我知道这NSCalendarUnit.WeekdayOrdinalCalendar是错的,但我尝试过我认为最合乎逻辑的组合.并且还混淆了myComponents.weekdayOrdinal例如使用mycomponents.day.weekday.

以下是我可以使用的选项:

static var EraCalendarUnit: NSCalendarUnit { get }
static var YearCalendarUnit: NSCalendarUnit { get }
static var MonthCalendarUnit: NSCalendarUnit { get }
static var DayCalendarUnit: NSCalendarUnit { get }
static var HourCalendarUnit: NSCalendarUnit { get }
static var MinuteCalendarUnit: NSCalendarUnit { get }
static var SecondCalendarUnit: NSCalendarUnit { get }
static var WeekCalendarUnit: NSCalendarUnit { get }
static var WeekdayCalendarUnit: NSCalendarUnit { get }
static var WeekdayOrdinalCalendarUnit: NSCalendarUnit { get }
static var QuarterCalendarUnit: NSCalendarUnit { get }
static var WeekOfMonthCalendarUnit: NSCalendarUnit { get }
static var WeekOfYearCalendarUnit: NSCalendarUnit { get }
static var YearForWeekOfYearCalendarUnit: NSCalendarUnit { get }
static var CalendarCalendarUnit: NSCalendarUnit { get }
static var TimeZoneCalendarUnit: NSCalendarUnit { get }
Run Code Online (Sandbox Code Playgroud)

我不清楚,因为没有DayOfWeekUnit选项(或类似的东西).

bra*_*ipt 134

斯威夫特3和4

在Swift 3中,检索星期几的数字会大大简化,因为DateComponents它不再是可选的.这是一个扩展:

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 Saturday
print(Date().dayNumberOfWeek()!) // 4
Run Code Online (Sandbox Code Playgroud)

如果您正在寻找星期几的书面本地化版本:

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
Run Code Online (Sandbox Code Playgroud)

  • 值得一提的是,如果你在例如使用它.表视图,它可能会减慢滚动速度,因为创建DateFormatter非常昂贵.如果您经常使用它,例如,它是好的.创建一个实例并在计算期间为所有函数调用提供它. (4认同)
  • 更简单的是下面@david72的答案:Calendar.current.component(.weekday, from: Date()) (2认同)
  • 什么是 dateFormat =“EEEE”?我在文档中找不到它 (2认同)

Mar*_*n R 111

你在寻找什么(如果我理解正确的话)是NSCalendarUnit.CalendarUnitWeekday.相应的属性NSDateComponentsweekday.

另请注意您的日期格式错误(完整规范可在此处找到:http://unicode.org/reports/tr35/tr35-6.html).

使用自动类型推断可以略微简化函数,也可以在常量足够的情况下使用很多变量.此外,该函数应返回一个可选项,nil 用于输入无效的字符串.

更新了Swift 3及更高版本的代码:

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
}
Run Code Online (Sandbox Code Playgroud)

例:

if let weekday = getDayOfWeek("2014-08-27") {
    print(weekday)
} else {
    print("bad input")
}
Run Code Online (Sandbox Code Playgroud)

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
    }
}
Run Code Online (Sandbox Code Playgroud)


Mat*_*jan 30

如果你想要完整的"星期日","星期一","星期二","星期三"等.

编辑:实际上有一种内置格式返回本地化的日期名称:

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

我之前的解决方案(仅限英文):

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]
    }
}
Run Code Online (Sandbox Code Playgroud)

您不需要打开日历和组件,它们由基础框架保证.

用法:

print(myDate.dayOfTheWeek())
Run Code Online (Sandbox Code Playgroud)

  • EEEEE和EEEEEE为您提供简短的日期,例如Wed,Th,Fr (5认同)

dav*_*d72 18

简单的答案(快速3):

Calendar.current.component(.weekday, from: Date())
Run Code Online (Sandbox Code Playgroud)

  • 复制粘贴更温和一点:let day = Calendar.current.component(.day, from: Today) (2认同)

Tr0*_*0yJ 10

在我的情况下,我每天都使用三个字母的字符串.我修改了@Martin R的功能如下:

func getDayOfWeekString(today:String)->String? {
    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
        switch weekDay {
        case 1:
            return "Sun"
        case 2:
            return "Mon"
        case 3:
            return "Tue"
        case 4:
            return "Wed"
        case 5:
            return "Thu"
        case 6:
            return "Fri"
        case 7:
            return "Sat"
        default:
            print("Error fetching days")
            return "Day"
        }
    } else {
        return nil
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 您可以将EEE用作`dateFormat`。 (2认同)

Ham*_*mid 10

有一种更简单的方法.只需将您的字符串日期传递给以下函数,它将为您提供日期名称:)

func getDayNameBy(stringDate: String) -> String
    {
        let df  = NSDateFormatter()
        df.dateFormat = "YYYY-MM-dd"
        let date = df.dateFromString(stringDate)!
        df.dateFormat = "EEEE"
        return df.stringFromDate(date);
    }
Run Code Online (Sandbox Code Playgroud)

  • 正在寻找"EEE".感谢名单 (2认同)

Aka*_*dhe 9

extension Date {

var weekdayName: String {
    let formatter = DateFormatter(); formatter.dateFormat = "E"
    return formatter.string(from: self as Date)
}

var weekdayNameFull: String {
    let formatter = DateFormatter(); formatter.dateFormat = "EEEE"
    return formatter.string(from: self as Date)
}
var monthName: String {
    let formatter = DateFormatter(); formatter.dateFormat = "MMM"
    return formatter.string(from: self as Date)
}
var OnlyYear: String {
    let formatter = DateFormatter(); formatter.dateFormat = "YYYY"
    return formatter.string(from: self as Date)
}
var period: String {
    let formatter = DateFormatter(); formatter.dateFormat = "a"
    return formatter.string(from: self as Date)
}
var timeOnly: String {
    let formatter = DateFormatter(); formatter.dateFormat = "hh : mm"
    return formatter.string(from: self as Date)
}
var timeWithPeriod: String {
    let formatter = DateFormatter(); formatter.dateFormat = "hh : mm a"
    return formatter.string(from: self as Date)
}

var DatewithMonth: String {
    let formatter = DateFormatter(); formatter.dateStyle = .medium ;        return formatter.string(from: self as Date)
}
}
Run Code Online (Sandbox Code Playgroud)

用法 let weekday = Date().weekdayName


Dil*_*ili 9

SWIFT 5 - 星期几

    extension Date {

        var dayofTheWeek: String {
             let dayNumber = Calendar.current.component(.weekday, from: self)
             // day number starts from 1 but array count from 0
             return daysOfTheWeek[dayNumber - 1]
        }

        private var daysOfTheWeek: [String] {
             return  ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]
        }
     }
Run Code Online (Sandbox Code Playgroud)

根据Fattie 的回答延长日期


que*_*ful 8

Swift 3日期延期

extension Date {
    var weekdayOrdinal: Int {
        return Calendar.current.component(.weekday, from: self)
    }
}
Run Code Online (Sandbox Code Playgroud)


qwe*_*der 7

您可以使用此表date_formats 将日期转换为不同的格式。我最短的代码:

func getDayOfWeek(today: String) -> Int{
    let formatter:NSDateFormatter = NSDateFormatter()
    formatter.dateFormat = "yyyy-MM-dd"
    let todayDate = formatter.dateFromString(today)
    formatter.dateFormat = "e" // "eeee" -> Friday
    let weekDay = formatter.stringFromDate(todayDate!)
    return Int(weekDay)!
}
getDayOfWeek("2015-12-18") // 6
Run Code Online (Sandbox Code Playgroud)


Leo*_*eon 5

这里已经有很多答案,但我认为还有另一种(也许更好)使用正确的CalendarAPI 来完成此操作的方法。

我建议在扩展中使用( docsweekdaySymbols )的属性来获取星期几:CalendarDate

extension Date {

    /// Returns the day of the week as a `String`, e.g. "Monday"
    var dayOfWeek: String {
        let calendar = Calendar.autoupdatingCurrent
        return calendar.weekdaySymbols[calendar.component(.weekday, from: self) - 1]
    }
}
Run Code Online (Sandbox Code Playgroud)

这需要首先初始化Date,我将使用自定义来完成DateFormatter

extension DateFormatter {

    /// returns a `DateFormatter` with the format "yyyy-MM-dd".
    static var standardDate: DateFormatter {
        let formatter = DateFormatter()
        formatter.dateFormat = "yyyy-MM-dd"
        return formatter
    }
}
Run Code Online (Sandbox Code Playgroud)

然后可以通过以下方式调用:

DateFormatter.standardDate.date(from: "2018-09-18")!.dayOfWeek
Run Code Online (Sandbox Code Playgroud)

为什么我更喜欢这个:

  1. dayOfWeek不必关心时区,因为使用了用户的日历,这里的一些其他解决方案将显示不正确的日期,因为不考虑时区。
  2. 您很可能需要在其他地方使用相同格式的日期,那么为什么不创建一个可重用的日期DateFormatter并使用它呢?
  3. weekdaySymbols已为您本地化。
  4. weekDaySymbols可以替换为其他选项,例如shortWeekdaySymbols“周一”、“周二”等。

请注意:此示例DateFormatter也不考虑时区或区域设置,您需要根据需要进行设置。如果日期始终准确,请考虑设置时区TimeZone(secondsFromGMT: 0)

  • 令人惊讶的是,这是唯一提到“weekdaySymbols”的答案,谢谢 (2认同)