如何正确使用TimeZone

时间:2017-12-26 15:49:43

标签: ios swift 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

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

1 个答案:

答案 0 :(得分:1)

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

description的{​​{1}}属性(如果只是Date print,则会使用该属性)始终返回GMT中显示的字符串。如果您想在当地时区看到它,您可以使用日期格式化程序将日期转换为字符串,例如

Date

底线,如果您想在应用的用户界面中显示日期(您希望在当地时区显示日期),请始终使用日期格式化程序。与let formatter = DateFormatter() formatter.dateStyle = .medium formatter.timeStyle = .medium print(formatter.string(from: datetime)) 一样,DateComponents的时区默认为当前时区。

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