nscalcalendar按月给出错误的周数



我有一个函数,它返回一个按月和按年计算的周数数组。

代码如下:

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,它将返回[31,32,33,34,35,36],这是正确的,因为这个网站。

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

如网站所述:

一年的第一个星期(wn1)是包含1月4日或一年的第一个星期二的星期。

所以,我必须写一些计算才能使它工作?还是有更简单的解决办法?谢谢你的帮助。

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

上面提到的网站上的日历是基于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)

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

NSCalendar显示的是序数0,而不是实际的前一年第52或53号。

最新更新