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(日期,金额:6))返回2015年12月27日,下午7:16
这是正确的(下周日)然而,如果我尝试返回该日期的周数,它将返回1,而这应该是53.我怎样才能获得正确的周数?
解决方法
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日历. (很奇怪)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。