【问题标题】:UTC to local time conversion not working in Swift 2UTC 到本地时间的转换在 Swift 2 中不起作用
【发布时间】:2017-03-03 07:47:52
【问题描述】:

我正在尝试将 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 处于设备的本地时区?

【问题讨论】:

  • 您是指特定设备上设置的当地时间吗?
  • 是 ios 设备上的当地时间
  • 如果您希望 date1 为 UTC,则对 date1 使用时区格式化程序。 dateFormatter.timeZone = NSTimeZone(name: "UTC")
  • 其实更关心的是date2,我想在设备的本地时区。如何检测本地时区?
  • 您在这里做错了,将 serverDate 转换为 UTC,然后使用您当地时区的新日期。它会解决你的问题。

标签: swift swift2 timezone nsdate nsdateformatter


【解决方案1】:

如果你想转换到设备上设置的时区,你可以这样做

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

【讨论】:

  • 哦对不起...你想要 swift 2...那是 swift 3。我会更新代码
  • @Prabhu 请查看更新后的代码。希望对你有帮助
【解决方案2】:

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

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

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

【讨论】:

  • 但无论如何,至少 date1 和 date2 都应该转换为 PDT 对吧?为什么两者都还是 UTC?
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-15
    • 1970-01-01
    • 2016-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-19
    相关资源
    最近更新 更多