swift - NSDate 返回错误的周数

标签 swift nsdate nsdateformatter

我有以下代码:

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/

相关文章:

iphone - 如何在 iPhone objective-c 中显示昨天(相对于日期,但不是 24 小时的时间间隔)访问过的项目

ios - SKSpriteNode 弹跳我没有在 Swift 中创建的东西

带有googleSignIn的ios firebase Auth获取后端服务器的IdToken

iOS7如何根据指定时区获取当前时间和日期?

ios - 如何使用 NSDateFormatter 获取本地时间(从 ICS 文件解析)

ios - 将字符串日期转换为 NSDate

ios - NSDate 到 NSString 错误

ios - 优化 iOS 应用程序的迭代循环

ios - Storyboard字段(标签/按钮等)没有出现

ios - 如何快速将字节数组转换为 base64 字符串?