我有以下代码:
getWeek(addDays(Date, amount: 6))
func addDays(date: NSDate, amount: Int) -> NSDate {
// calculation $additionalDays
let additionalDays = amount
// adding $additionalDays
let components = NSDateComponents()
components.day = additionalDays
// important: NSCalendarOptions(0)
let futureDate = NSCalendar.currentCalendar()
.dateByAddingComponents(components, toDate: date, options: NSCalendarOptions(rawValue: 0))
return futureDate!
}
func getWeek(today:NSDate)->Int? {
let formatter = NSDateFormatter()
formatter.dateFormat = "yyyy-MM-dd"
let myCalendar = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)!
let myComponents = myCalendar.components(.WeekOfYear, fromDate: today)
let weekNumber = myComponents.weekOfYear
return weekNumber
}
getWeek(addDays(Date, amount: 6))
中的日期返回 dec 27, 2015, 7:16PM
这是正确的(下周日)但是,如果我尝试返回该日期的周数,它返回 1
而这应该是 53。我如何获得正确的周数?
最佳答案
根据 Apple 开发者技术支持:
27 Dec 2015 is week 52, not week 53. The first day of week 53 in 2015 is 28 Dec.
Regardless, you’re correct that the value returned by your
getWeek()
function does not match ISO 8601. The reason for that is that you’re using NSCalendarIdentifierGregorian rather than NSCalendarIdentifierISO8601. There are /lots/ of different ways to do week-of-year calculations. I can go into the gory details if you’d like, but the ‘take home’ message here is that, if you want ISO 8601 week calculations, you should use NSCalendarIdentifierISO8601.
有了这个改变,getWeek()
开始产生符合 ISO 8601 的结果。具体来说:
print(self.getWeek(self.dateFromFixedFormatString("2015-12-27 12:34")))
print(self.getWeek(self.dateFromFixedFormatString("2015-12-28 12:34")))
打印:
- 52
- 53
假设:
func dateFromFixedFormatString(dateStr: String) -> NSDate {
let df = NSDateFormatter()
df.locale = NSLocale(localeIdentifier: "en_US_POSIX")
df.dateFormat = "yyyy-MM-dd HH:mm"
return df.dateFromString(dateStr)!
}
func getWeek(today:NSDate) -> Int {
let myCalendar = NSCalendar(calendarIdentifier: NSCalendarIdentifierISO8601)!
let myComponents = myCalendar.components(.WeekOfYear, fromDate: today)
let weekNumber = myComponents.weekOfYear
return weekNumber
}
因此,任何声明 GregorianCalendar 在我的代码中不起作用的人都是正确的,并且应该专门使用 NSCalendarIdentifierISO8601。 NSCalendar.currentCalendar()
不会自动获取 ISO 日历。 (很奇怪)
关于swift - NSDate 返回错误的周数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34402001/