我有一个函数,它返回一个由月和年组成的周数数组。
以下是代码:
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日或本年度第一个星期二的一周。
那么,我必须写一些计算才能使它有效吗?或者有一个更简单的解决方案?谢谢你的帮助。
答案 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位。