【问题标题】:How to use TimeZone correctly如何正确使用时区
【发布时间】: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

标签: ios swift timezone


【解决方案1】:

2017-12-26 11:45:00 +0000 以 GMT/UTC/Zulu 显示日期(这就是 +0000 的含义)。底线,2017 年 12 月 26 日下午 12:45,布拉格 格林威治标准时间 11:45。

Datedescription 属性(如果您只是 printDate 则使用该属性)始终返回以 GMT 显示的字符串。如果您想在本地时区查看它,您可以使用日期格式化程序将日期转换为字符串,例如

let formatter = DateFormatter()
formatter.dateStyle = .medium
formatter.timeStyle = .medium
print(formatter.string(from: datetime))

最重要的是,如果您想在应用的用户界面中显示日期(您希望在本地时区显示日期),请始终使用日期格式化程序。和DateComponents一样,DateFormatter的时区默认为当前时区。

注意,我避免使用 DateFormatterdateFormat 属性,因为每当在应用程序 UI 中显示日期字符串时,您都希望使用本地化字符串(以最终用户首选的格式显示的日期,如指定在“设置”应用中)。实现这一点的最简单方法是使用dateStyletimeStyle,如上所示。

【讨论】:

    猜你喜欢
    • 2013-12-26
    • 1970-01-01
    • 1970-01-01
    • 2011-12-09
    • 2022-01-04
    • 1970-01-01
    • 1970-01-01
    • 2015-09-13
    • 1970-01-01
    相关资源
    最近更新 更多