UTC到本地时间转换无法在Swift 2中运行

时间:2016-10-21 05:43:07

标签: swift swift2 timezone nsdate nsdateformatter

我正在尝试将UTC时间转换为本地时区,但它似乎根本没有转换它:

let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"
let date1 = dateFormatter.dateFromString(dateStringFromServer)!
dateFormatter.timeZone = NSTimeZone.localTimeZone()
let date2 = dateFormatter.dateFromString(dateStringFromServer)!

dateStringFromServer是UTC日期的字符串表示。所以我期望date1在UTC中,而date2在PDT(我的本地时区),但它们都是相同的。我的语法有问题吗?

这就是我得到的:

dateStringFromServer: 2016-10-21T05:24:26.000Z
date1: 2016-10-21 05:24:26 +0000
date2: 2016-10-21 05:24:26 +0000

如何让date2在设备的本地时区?

3 个答案:

答案 0 :(得分:0)

如果要转换为设备上设置的时区,可以执行此操作

Swift3

    let dateFormatter =  DateFormatter()
    dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"
    let date1 = dateFormatter.date(from: dateStringFromServer)
    // return the timeZone of your device i.e. America/Los_angeles
    let timeZone = TimeZone.autoupdatingCurrent.identifier as String
    dateFormatter.timeZone = TimeZone(identifier: timeZone)
    let date2 = dateFormatter.string(from: date1)

Swift2

     let dateFormatter = NSDateFormatter()
    dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"
    let date1 = dateFormatter.dateFromString(dateStringFromServer)
    // return the timeZone of your device i.e. America/Los_angeles
    let timeZone = NSTimeZone.localTimeZone().name
   dateFormatter.timeZone =  NSTimeZone(name: timeZone)
    let date2 = dateFormatter.stringFromDate(date1!)

答案 1 :(得分:0)

它是一样的,因为即使您认为在设置第一个日期之后将日期格式化程序的时区设置为当前时区,它也不会#39;重要。如果您没有设置日期格式化程序的时区,它会自动设置为Apple NSDateFormatter的文档中指定的系统时区:

  

如果未指定,则使用系统时区。

因此,日期格式化程序的时区对于第一个日期和第二个日期都是隐式设置的,因为它们恰好相同,因此您将获得相同的日期。

答案 2 :(得分:0)

这是在swift4中工作的代码。

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

    let dt = dateFormatter.date(from: date)
    dateFormatter.timeZone = TimeZone.current
    dateFormatter.dateFormat = toFormat

    return dateFormatter.string(from: dt!)
}
  

使用方法:-

let localDateAsString = UTCToLocal(date: deadline!, fromFormat: "yyyy-MM-dd HH:mm:ss", toFormat: "MM-dd-yyyy hh:mm a")