【问题标题】:ISO8601dateformatter 1970-01-01 00:00:00 issueISO8601dateformatter 1970-01-01 00:00:00 问题
【发布时间】:2021-06-08 22:37:33
【问题描述】:

如何处理新年和去年回归的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

【问题讨论】:

  • 看看小时也会很有趣 - 也许是时区的事情。
  • @chux-ReinstateMonica:我认为这只是闰秒(1977 年 12 月 31 日),图书馆似乎第一次使用这样的时间戳。 (posix 时间戳不考虑闰秒)

标签: swift date calendar iso8601


【解决方案1】:

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

1978年月1日1纪元:1

【讨论】:

  • formatter.timeZone = TimeZone(abbreviation: "PDT") 1978-01-01 08:00:00 +0000 年 1978 月 1 天 1 时代:1 datestring2 : 1978-01-01 .谢谢你。我实际上添加“UTC”只是作为测试。未设置时区时,应用程序不应该自动默认为设备的本地设置吗?但是如果我删除 UTC,我仍然会收到错误。
  • 我看到读取和格式化本地时区都被使用了。两端必须同步。谢谢!! stackoverflow.com/questions/50052873/…
  • formatter.timeZone = TimeZone(缩写:“UTC”)calendar.timeZone = TimeZone.init(缩写:“UTC”)
  • 只是不要设置时区。它已经设置为 UTC,这是一个繁重的操作
  • /* 请注意,重置这些属性时可能会产生巨大的性能成本。重置每个属性可能会导致重新生成整个 CFDateFormatterRef,这可能非常昂贵。 */ 我明白你所说的沉重是什么意思。谢谢!。
猜你喜欢
  • 1970-01-01
  • 2012-03-14
  • 2015-04-12
  • 1970-01-01
  • 1970-01-01
  • 2011-05-07
  • 2020-07-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多