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

问题描述

如何处理新的一年和去年作为年度组件返回的 ISO8601。

令我震惊的是,我意识到 ISO8601DateFormatter 将 1977 作为一年回到 1978-01-01 00:00:00

意识到这一点需要一段时间。结果证明并没有错。尽管如此,考虑到 1978 年的具体年份,格式化返回 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,它会准确打印您所期望的内容:

1978 年 1 月 1 日 1 纪元:1