ISO8601dateformatter 1970-01-01 00:00:00 问题

ISO8601dateformatter 1970-01-01 00:00:00 issue

如何处理新年和 ISO8601 return将去年作为年度组成部分。

令我恐惧的是,我意识到 ISO8601DateFormatter returning 1977 作为 1978-01-01 00:00:00

的一年

花了一段时间才意识到这一点。事实证明没有错。尽管如此,考虑到具体年份是 1978 年,对于格式为 return 1977 的格式令人震惊。

我什至不需要时间戳。我怎样才能可靠地检索指定的年份,而不必在每个日历日期上添加一秒钟?

import Foundation

let datestring = "1978/1/1"
var formatter = ISO8601DateFormatter()
formatter.timeZone = TimeZone(abbreviation: "UTC")
formatter.formatOptions = [.withFullDate]
let date2 = formatter.date(from: datestring) ?? Date()
print(date2)
var calendar = Calendar(identifier: .iso8601)
var year = calendar.component(.year, from: date2)
var month = calendar.component(.month, from: date2)
var day = calendar.component(.day, from: date2)
var era = calendar.component(.era, from: date2)
print("year \(year) month \(month) day \(day) era: \(era)")

===
1978-01-01 00:00:00 +0000
year 1977 month 12 day 31 era: 1

默认情况下,日历实例将具有您的本地时区。你可以通过打印 print(calendar.timeZone.abbreviation() ?? "UNKNOWN") 来看到这一点。在我的例子中(在美国华盛顿州西雅图)它打印“PDT”。如果您只是将日历时区设置为 UTC,它会准确打印出您所期望的:

year 1978 month 1 day 1 era: 1