Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/121.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios NSDateComponents返回错误的工作日_Ios_Swift_Nsdatecomponents - Fatal编程技术网

Ios NSDateComponents返回错误的工作日

Ios NSDateComponents返回错误的工作日,ios,swift,nsdatecomponents,Ios,Swift,Nsdatecomponents,如果要运行此代码: // 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 // def

如果要运行此代码:

// 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
....
这更有道理,但我真的需要把一周的第一天定为周一

我已经为您设置了一个演示项目,您可以自己测试这种行为


正如所指出的,
组件。如果您的一周不是从星期二开始,那么工作日
不会改变。奇怪的是,
components.weekOfMonth
在您的一周从周一开始时确实会发生变化

我的问题的解决方案

另一个问题的答案是,如果日历的一周不是以星期天开始,那么让我来看看如何找到所需的工作日

dayOfWeek = calendar.ordinalityOfUnit(.WeekdayCalendarUnit, inUnit: .WeekCalendarUnit, forDate: _date)
该代码还可用于查找月份的周或月份本身:

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

完全正确。如果你看。
你可以看到1是星期天,2是星期一等等。所以5号星期四和预期的一样。

也看到你是对的。。。多么让人困惑的是
组件。weekOfMonth
会根据第一个工作日进行更新,而
组件。weekOfMonth
不会!还是合乎逻辑?