NSDateComponents返回错误的工作日

Tie*_*eme 2 nsdatecomponents ios swift

如果您将运行以下代码:

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

您可能会回来:

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

那些工作日是错误的。

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

这样做更有意义,但是我真的需要在一周的第一天成为星期一。

我已经为您建立了一个演示项目来亲自测试此行为。https://github.com/tiemevanveen/NSDateComponentsTest/tree/master


正如sha所指出的,components.weekday如果您的一周不在星期天开始,则不会更改。components.weekOfMonth当您的一周从星期一开始时,奇怪的事情会改变。

解决我的问题

另一个问题的答案是,如果日历的星期不是从星期日开始的,那么我就可以找到所需的工作日。

dayOfWeek = calendar.ordinalityOfUnit(.WeekdayCalendarUnit, inUnit: .WeekCalendarUnit, forDate: _date)
Run Code Online (Sandbox Code Playgroud)

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

dayOfWeek = calendar.ordinalityOfUnit(.WeekdayCalendarUnit, inUnit: .WeekCalendarUnit, forDate: _date)
month = calendar.ordinalityOfUnit(.MonthCalendarUnit, inUnit: .YearCalendarUnit, forDate: _date)
Run Code Online (Sandbox Code Playgroud)

sha*_*sha 5

都没错 如果您查看Apple文档。您会看到1是星期日,2-是星期一,依此类推。所以5是预期的星期四。

  • 您是对的...令人困惑的是components.weekOfMonth确实根据firstweekDay更新,而components.weekday却没有!还是合乎逻辑的? (3认同)