NSCalendar按月提供错误的周数

mkz*_*mkz 2 week-number nscalendar ios swift

我有一个函数,它返回一个由月和年组成的周数数组.

这是代码:

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

示例:对于2015-08-21,它将返回[31,32,33,34,35,36],这是正确的,因为该网站.

它工作正常,但我发现一个错误,如果我通过这个日期"2016-01-01"它返回[1,2,3,4,5],但正确的数组应该是[53(从2015年),1, 2,3,4](再次在本网站查看).

如该网站所述:

一年中的第一周(WN 1)是包含1月4日或本年度第一个星期二的一周.

那么,我必须写一些计算才能使它有效吗?或者有一个更简单的解决方案?感谢帮助.

vad*_*ian 5

结果取决于日历类型,区域设置和周工作日设置.

上述网站上的日历基于ISO 8601,您currentCalendar()可能是格里高利,两种类型相似但不相同.

请在游乐场中查看此内容,并尝试取消注释注释行并提供其他区域设置标识符.

代码适用于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)
Run Code Online (Sandbox Code Playgroud)

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

NSCalendar显示序号0而不是前一年的实际数字52或53.