【问题标题】:NSDateComponents returns wrong weekdayNSDateComponents 返回错误的工作日
【发布时间】:2015-01-16 18:32:08
【问题描述】:

如果你要运行这段代码:

// January 16th 2015 10:20 AM in Amsterdam
var date = NSDate(timeIntervalSince1970: 1421400000)

var formatter = NSDateFormatter()
formatter.dateFormat = "dd-MMM"

let calendar = NSCalendar.currentCalendar()
calendar.firstWeekday = 2 // default when region == Netherlands

let units = NSCalendarUnit.YearCalendarUnit | NSCalendarUnit.MonthCalendarUnit
    | NSCalendarUnit.WeekOfMonthCalendarUnit | NSCalendarUnit.DayCalendarUnit
    | NSCalendarUnit.WeekdayCalendarUnit

// Loop days in January
for day in 1...14 {

    // select day in month
    var components = calendar.components(units, fromDate: date)
    components.day = day

    // get day and components
    let _date = calendar.dateFromComponents(components)!
    var _components = calendar.components(units, fromDate: _date)

    // retrieve characteristics
    let weekOfMonth = _components.weekOfMonth
    let dayOfWeek = _components.weekday
    let month = _components.month

    println("\(formatter.stringFromDate(_date)) is day \(dayOfWeek) of week \(weekOfMonth) of month \(month) \n")
}

你可能会回来:

01-Jan is day 5 of week 1 of month 1
02-Jan is day 6 of week 1 of month 1
03-Jan is day 7 of week 1 of month 1
04-Jan is day 1 of week 1 of month 1
05-Jan is day 2 of week 2 of month 1
06-Jan is day 3 of week 2 of month 1
07-Jan is day 4 of week 2 of month 1
.... 

那些工作日是错误的。

1 月 1 日不仅应该是第 4 天(星期四),1 月 3 日似乎是第 1 周的第 7 天,而 1 月 4 日似乎是同一天的第 1 天也很奇怪星期。

显然我在这里做错了什么,谁能帮帮我?

当您删除 calendar.firstWeekday = 2 行时,您会得到:

01-Jan is day 5 of week 1 of month 1
02-Jan is day 6 of week 1 of month 1
03-Jan is day 7 of week 1 of month 1
04-Jan is day 1 of week 2 of month 1
05-Jan is day 2 of week 2 of month 1
06-Jan is day 3 of week 2 of month 1
07-Jan is day 4 of week 2 of month 1
....

这更有意义,但我真的需要一周的第一天是这里的星期一..

我已经为您设置了一个演示项目来自己测试这种行为。 https://github.com/tiemevanveen/NSDateComponentsTest/tree/master


正如sha 指出的那样,如果您的一周不是从 sSnday 开始,components.weekday 不会改变。奇怪的是components.weekOfMonth 确实会在您的一周从星期一开始时发生变化..

我的问题的解决方案

answer 另一个问题让我找到一种方法来找到所需的工作日,如果日历的一周不是从星期日开始的。

dayOfWeek = calendar.ordinalityOfUnit(.WeekdayCalendarUnit, inUnit: .WeekCalendarUnit, forDate: _date)

该代码还可用于查找月份中的星期或月份本身:

dayOfWeek = calendar.ordinalityOfUnit(.WeekdayCalendarUnit, inUnit: .WeekCalendarUnit, forDate: _date)
month = calendar.ordinalityOfUnit(.MonthCalendarUnit, inUnit: .YearCalendarUnit, forDate: _date)

【问题讨论】:

    标签: ios swift nsdatecomponents


    【解决方案1】:

    这一切都是正确的。如果您查看Apple Documentation。 您可以看到 1 是星期日,2 - 是星期一,依此类推。所以 5 是预期的星期四。

    【讨论】:

    • 你说得对...components.weekOfMonth 确实根据 firstweekDay 更新而 components.weekday 没有更新,这多么令人困惑!或者这是合乎逻辑的吗?
    猜你喜欢
    • 2013-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-16
    • 2019-06-30
    相关资源
    最近更新 更多