使用Swift将UTC日期转换为本地时间:添加小时而不是删除小时

时间:2018-08-05 17:05:24

标签: swift timezone nsdate

我正在尝试将UTC日期转换为当前时区,但是我注意到时间问题。

我在塔希提岛/法属玻里尼西亚(UTC-10),当前时间(使用格式:yyyy / MM / dd HH:mm:ss)为:2018/08/05 06:45 :00

Google表示UTC时间为:2018/08 / 05 16:45:00

使用以下代码,结果为:2018/08 / 06 02:45:42 +0000(后天)而不是2018/08/05 06:45:42 + 0000(今天)。

将Date()转换为当前时区增加10小时,而不是删除10小时

我的错误在哪里?

快捷键3

import Foundation

    extension Date {

     var toLocalTimezone : Date {

      let formatter = DateFormatter()
      formatter.dateFormat = "yyyy/MM/dd' 'HH:mm:ss"
      formatter.timeZone = TimeZone(secondsFromGMT:0) // UTC
      let defaultTimeZoneStr = formatter.string(from: self)

      let dateFormatter = DateFormatter()
      formatter.timeZone = TimeZone.current // Local
      dateFormatter.dateFormat = "yyyy/MM/dd' 'HH:mm:ss"

      return dateFormatter.date(from:defaultTimeZoneStr)!

      }

    }

    debugPrint("\(TimeZone.current)")
    debugPrint("Locale time : \(Date().toLocalTimezone.toFormat(format: DateFormats.yyyyMMddHHmmss))" )

结果:

  

“当前时区:太平洋/大溪地(当前)”

     

“语言环境时间:2018-08-06 02:45:42”

而不是:

  

“语言环境时间:2018-08-05 06:45:42”

1 个答案:

答案 0 :(得分:0)

实际上很简单。 timeZone的{​​{1}}属性告诉DateFormatterDateFormatter 生成的字符串应在哪个时区 OR 时区是您要尝试将转换为Date 的字符串。

在您的情况下意味着什么?

Date

这意味着您正在将 let formatter = DateFormatter() formatter.dateFormat = "yyyy/MM/dd' 'HH:mm:ss" formatter.timeZone = TimeZone(secondsFromGMT:0) // UTC let defaultTimeZoneStr = formatter.string(from: self) 格式化为Date,结果String将位于String

另一方面:

TimeZone(secondsFromGMT:0)

您告诉格式化程序您在 let dateFormatter = DateFormatter() formatter.timeZone = TimeZone.current // Local dateFormatter.dateFormat = "yyyy/MM/dd' 'HH:mm:ss" return dateFormatter.date(from:defaultTimeZoneStr)! 中有一个String,它将尝试从中创建一个TimeZone.current

Date始终是GMT + 0,应该使用其他API(Date)将其转换为输出格式和时区。

我的理解是,您正在尝试创建一个函数,该函数将以自定义格式和用户时区输出格式化为DateFormatter的{​​{1}}。这是我相信您正在寻找的摘录:

Date