我有以下代码:
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开发者技术支持:
2015年12月27日是第52周,而不是第53周.2015年第53周的第一天是12月28日.
无论如何,你的函数返回的值
getWeek()
与ISO 8601不匹配是正确的.原因是你使用的是NSCalendarIdentifierGregorian而不是NSCalendarIdentifierISO8601.有/很多/不同的方法来进行一周的计算.如果你愿意,我可以进入血腥细节,但这里的'带回家'信息是,如果你想要ISO 8601周计算,你应该使用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日历.(很奇怪)