NSCalendar 按年按月给出错误的周数

NSCalendar gives wrong week numbers by month in year

我有一个函数,它 return 是一个由月份和年份组成的周数数组。

代码如下:

let calendar = NSCalendar.currentCalendar()
let weekRange = calendar.rangeOfUnit(NSCalendarUnit.CalendarUnitWeekOfYear, inUnit: .CalendarUnitMonth, forDate: NSDate())
weekArray = Array(weekRange.location..<weekRange.location + weekRange.length)

示例: 对于 2015-08-21 它将 return [31, 32, 33, 34, 35, 36] 这是正确的,因为 this website.

它工作正常但我发现一个错误如果我通过这个日期“2016-01-01”它 returns [1, 2, 3, 4, 5] 但正确的数组应该是[53(从 2015 年开始),1、2、3、4](再次检查 this website)。

如该网站所述:

The first week of the year (WN 1) is the week containing january 4th or the first tuesday of the Year.

那么,我必须写一些计算才能让它起作用吗?或者有更简单的解决方案?感谢您的帮助。

结果取决于日历类型、区域设置和一周中的第一个工作日设置。

上述网站上的日历基于 ISO 8601,您的 currentCalendar() 可能是公历,两种类型相似但不完全相同。

请在 playground 中查看并尝试取消对注释行的注释并提供其他区域设置标识符。

该代码适用于 Swift 2.0,在 Swift 1.2 中使用 .CalendarUnitWeekOfYear.CalendarUnitMonth

let components = NSDateComponents()
components.year = 2016
components.month = 1

var weekNumbersForCalendarIdentifier = { ( identifier : String) -> [Int] in
  let calendar = NSCalendar(calendarIdentifier: identifier)!
  // calendar.locale = NSLocale(localeIdentifier: "us_POSIX")
  let weekRange = calendar.rangeOfUnit(.WeekOfYear, inUnit: .Month, forDate: calendar.dateFromComponents(components)!)
  return Array(weekRange.location..<weekRange.location + weekRange.length)
}

let resultISO = weekNumbersForCalendarIdentifier(NSCalendarIdentifierISO8601)
let resultGregorian = weekNumbersForCalendarIdentifier(NSCalendarIdentifierGregorian)

有一种独立于不同设置的特定行为:

NSCalendar displays the ordinal number 0 rather than the actual number 52 or 53 of the preceding year.