NSCalendar按月提供错误的周数

时间:2015-08-21 10:41:18

标签: ios swift nscalendar week-number

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

以下是代码:

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],这是正确的this website

它工作正常,但如果我通过这个日期我发现了一个错误&#34; 2016-01-01&#34;它返回[1,2,3,4,5],但正确的数组应为[53(从2015年起),1,2,3,4](再次在this website上检查)。

如该网站所述:

  

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

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

1 个答案:

答案 0 :(得分: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)

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

  

NSCalendar显示序号0而不是实际值   上一年的第52或53位。