【问题标题】:Convert from UTC to local timezone give wrong result从 UTC 转换为本地时区会给出错误的结果
【发布时间】:2017-10-02 18:34:19
【问题描述】:

背景
我需要将格式为“HH:mm”的时间字符串从UTC转换为本地时区。例如,如果 UTC 时间是 09:00,则本地时间(斯德哥尔摩/欧洲)应该提前两个小时。

问题
当我将 09:00 (UTC) 转换为斯德哥尔摩/欧洲时间时,我得到 10:00。应该是 11:00。

func UTCToLocal(date:String) -> String {
    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "HH:mm"
    dateFormatter.timeZone = TimeZone(abbreviation: "UTC")

    let dt = dateFormatter.date(from: date)
    dateFormatter.timeZone = TimeZone.current //Stockholm/Europe

    return dateFormatter.string(from: dt!)
}

print(UTCToLocal(date: "09:00")) //prints 10:00

为什么时区与想象的不同?

【问题讨论】:

  • 打印dt。用它的输出更新你的问题。很可能是某个旧日期导致了您的问题。
  • 不相关但为什么将dateFormat 两次设置为相同的格式?为什么要在date 上使用字符串插值?就做let dt = dateFormatter.date(from: date)

标签: swift date timezone nsdate utc


【解决方案1】:

您只指定了时间,但没有指定日期,因此“09:00”被转换 到日期“2000-01-01 09:00:00 +0000”。当时斯德哥尔摩没有实行夏令时,当地时间是 10:00。

如果您想要当天的转换,那么您可以设置

dateFormatter.defaultDate = Date()

【讨论】:

    猜你喜欢
    • 2016-04-21
    • 2011-09-16
    • 1970-01-01
    • 1970-01-01
    • 2011-07-25
    • 2013-07-31
    • 2021-04-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多