UTC 到本地时间的转换在 Swift 2 中不起作用

UTC to local time conversion not working in Swift 2

我正在尝试将 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

    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)

斯威夫特2

     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!)

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

指定的系统时区

If unspecified, the system time zone is used.

因此,日期格式化程序的时区在第一个日期隐式设置为相同,而在第二个日期显式设置为相同,因为它们恰好相同,因此您得到相同的日期。

这是在 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!)
}

How to use :-

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