【问题标题】:iOS 10 timezone format trouble with dates created as timeIntervalSince1970iOS 10 时区格式问题,日期创建为 timeIntervalSince1970
【发布时间】:2017-07-08 16:46:28
【问题描述】:

在我提交雷达之前,我想仔细检查一下我是否没有遗漏任何东西(并从中吸取教训)。这是我在 Swift 3 操场上的测试代码(代码在我的应用程序中的行为相同)。我目前在“欧洲/里斯本”时区工作,该时区在 2 月与格林威治标准时间相同。

import UIKit

let date =  Date(timeIntervalSince1970: 0)
var formatter = DateFormatter()
formatter.dateFormat = "HH:mm"

print(TimeZone.current.abbreviation()!) // GMT

formatter.timeZone = TimeZone.current
print(formatter.string(from: date)) // 01:00

formatter.timeZone = TimeZone(secondsFromGMT: TimeZone.current.secondsFromGMT())
print(formatter.string(from: date)) // 00:00

formatter.timeZone = TimeZone(identifier: "Europe/London")
print(formatter.string(from: date)) // 01:00

formatter.timeZone = TimeZone(identifier: "America/Los_Angeles")
print(formatter.string(from: date)) // 16:00

不知何故,格式化的时间是一小时,除非我将时区设置为

TimeZone(secondsFromGMT: TimeZone.current.secondsFromGMT())

这是预期的行为吗?谢谢!

【问题讨论】:

  • 我遇到了类似的日期问题。我的问题是由格式化程序引起的,而不是由时区引起的。 Swift 中的 NSDate 或 Date 仅适用于 UTC。格式化程序负责表示。就我而言,我必须将格式化程序的日历属性设置为公历,然后一切都按预期工作。

标签: ios swift timezone dateformatter


【解决方案1】:

结果实际上是正确的,因为在 1970 年,“欧洲/里斯本”时区是“UTC+1”:

let tz = TimeZone(identifier: "Europe/Lisbon")!

print(tz.secondsFromGMT())
// Output: 0

print(tz.secondsFromGMT(for: Date(timeIntervalSince1970: 0)))
// Output: 3600

因此“格林威治标准时间 1970 年 1 月 1 日”的午夜是凌晨 1 点 在里斯本。

您可以查找时区和夏令时时段 过去和未来几年,https://www.timeanddate.com/time/zone/portugal/lisbon

【讨论】:

  • 嗨@mar​​tin-r,这是否意味着在测试中使用Date(timeIntervalSince1970: X) 是危险的?看起来制作“时区无关”时间戳的唯一方法是使用日期组件?
  • @Vladimir:“危险”到底是什么意思? Date 是一个绝对时间点(内部存储为自 2000 年 1 月 1 日以来的秒数,UTC)并且没有时区/日历/...信息。 – DateComponents 是一个包含年、月、日等整数的结构体,并且只有在日历(和时区)的上下文中解释时才成为 date。 – 所以这取决于你想测试什么。
  • @MartinR 你说得对。我对 Date 是 UTC 但公历默认为“本地时间”这一事实感到困惑。
猜你喜欢
  • 2014-10-28
  • 1970-01-01
  • 1970-01-01
  • 2020-11-22
  • 2018-06-18
  • 1970-01-01
  • 1970-01-01
  • 2014-12-17
  • 2020-10-26
相关资源
最近更新 更多