【问题标题】:From UTC to local time doesn't consider daylight saving swift从 UTC 到当地时间不考虑夏令时 swift
【发布时间】:2021-01-21 01:55:09
【问题描述】:

我正在使用此函数将 UTC 时间转换为我的本地时间戳。

    func UTCToLocal(date:String, timeZone: String) -> String {
    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "H:mm:ss"
    dateFormatter.timeZone = TimeZone(abbreviation: "UTC")
    let dt = dateFormatter.date(from: date)
    dateFormatter.timeZone = TimeZone(identifier: timeZone)
    dateFormatter.dateFormat = "h:mm a"
    return dateFormatter.string(from: time)
}

但这不会检查 DST。所以,我得到一小时的差异。谁能帮我解决这个问题的一些通用解决方案?


感谢 Leo 解决了这个问题。我已将功能更新为:

    func UTCToLocal(date:String, timeZone: String) -> String {
    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"
    dateFormatter.locale = Locale(identifier: "en_US_POSIX")
    dateFormatter.timeZone = TimeZone(secondsFromGMT: 0)
    let dt = dateFormatter.date(from: date)
    dateFormatter.timeZone = TimeZone(identifier: timeZone)
    dateFormatter.dateFormat = "dd-MM-yyyy hh:mm aa"
    return dateFormatter.string(from: dt!)
}

现在函数参数中的日期字符串具有这种格式“yyyy-MM-dd'T'HH:mm:ss.SSS'Z'”的值。这样就解决了问题。

【问题讨论】:

  • 您能否举例说明您获得“一小时差异”的日期和时区?
  • iphone上的时间是准确的。但我的应用显示时间错误。
  • 与您手机的时区无关。你给UTCToLocal传递了什么参数?你期望它返回什么?它实际上返回了什么?
  • 好的,我为函数传递的值是 date = "108:11:00" 和 timeZone = "America/Toronto"。我从 TimeZone.current.identifier 得到这个 timeZone 我得到的响应是凌晨 3:11
  • 我期待的回复是凌晨 4 点 11 分。

标签: swift timestamp utc localtime datetime-conversion


【解决方案1】:

这里的问题是缺少日期。您总是只传递没有日期的时间组件,因此夏令时将始终对应于 2001 年 1 月 1 日。如果您需要今天的日期,您需要将日期格式化程序 defaultDate 属性设置为今天的 startOfDay。顺便说一句,在设置固定日期格式之前,不要忘记先将语言环境设置为“en_US_POSIX”。

【讨论】:

    猜你喜欢
    • 2018-02-04
    • 1970-01-01
    • 2020-01-13
    • 2014-06-01
    • 1970-01-01
    • 2013-09-22
    • 1970-01-01
    • 1970-01-01
    • 2011-08-14
    相关资源
    最近更新 更多