【发布时间】:2017-12-26 15:49:42
【问题描述】:
我在 Swift 4 for iOS 中有以下代码
var dateComponents = DateComponents()
var datetime = Date()
dateComponents.timeZone = Calendar.current.timeZone
dateComponents.day = Calendar.current.component(.day, from: datetime)
dateComponents.month = Calendar.current.component(.month, from: datetime)
dateComponents.year = Calendar.current.component(.year, from: datetime)
dateComponents.hour = 12
dateComponents.minute = 45
datetime = Calendar.current.date(from: dateComponents)!
print(Calendar.current.timeZone)
print(datetime)
它会产生这个输出:
欧洲/布拉格(当前)
2017-12-26 11:45:00 +0000
虽然我期待
2017-12-26 12:45:00 +0000
由于指定了时区。我必须做些什么不同的事情? 谢谢。
【问题讨论】:
-
为什么您希望小时是 21?您将小时设置为当地时间 12,这似乎比 UTC 时间早一小时。所以 11 小时 UTC 的结果是正确的,而不是 21。
-
仅供参考 - 没有理由将时区设置为当前时区,因为这已经是默认时区了。
-
错字 - 我预计 12:45
-
但是如果我将 dateComponents.timeZone = Calendar.current.timeZone 更改为 dateComponents.timeZone = TmeZone(abbreviation: “GMT”) 那么它会按我的预期工作。所以时区发挥了作用
-
是的,但我怀疑这也不是您想要的,因为
2017-12-26 12:45:00 +0000中的+0000表示“伦敦/格林威治标准时间的 12:45”,如您所知,实际上是 13:45在布拉格。不要再担心print(datetime)显示的内容,因为它总是会显示datetime的GMT 表示。每当您想在本地时区显示String表示Date对象时,请始终使用DateFormatter。