当前位置:  开发笔记 > 编程语言 > 正文

NSDate返回错误的周数

如何解决《NSDate返回错误的周数》经验,为你挑选了1个好方法。

我有以下代码:

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.我怎样才能得到正确的周数?



1> Brian van de..:

根据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日历.(很奇怪)

推荐阅读
手机用户2402851155
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有