如何正确使用TimeZone

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何正确使用TimeZone相关的知识,希望对你有一定的参考价值。

我在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

由于时区指定。我必须采取哪些不同的做法?谢谢。

答案

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

descriptionDate属性(如果你只是printDate就使用的那个)总是会返回GMT中显示的字符串。如果您想在当地时区看到它,您可以使用日期格式化程序将日期转换为字符串,例如

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

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

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

以上是关于如何正确使用TimeZone的主要内容,如果未能解决你的问题,请参考以下文章

如何正确地将多个片段添加到片段过渡?

date_default_timezone_set("Europe/London") 不返回正确的时间

java: timezone getTimeZone("GMT-0700")' 时区使用日光不正确

使用 (Child)FragmentManager 正确使用子子片段

如何在片段而不是活动中使用 setContentView

片段上的 Mapbox 膨胀视图