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

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

谷歌表示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”

最佳答案

实际上很简单。 timeZoneDateFormatter属性告诉DateFormatterDate生成的字符串应位于哪个时区,或者您要转换为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

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

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

extension Date {
  func format(_ format: String) -> String {
    let formatter = DateFormatter()
    formatter.dateFormat = format
    formatter.timeZone = TimeZone.current // Local
    return formatter.string(from: self)
  }
}

关于swift - 使用Swift将UTC日期转换为本地时间:添加小时而不是删除小时,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51696482/

10-14 21:23
查看更多