Преобразование UTC в местное время не работает в Swift 2

#swift #swift2 #timezone #nsdate #nsdateformatter

#swift #swift2 #Часовой пояс #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 находиться в местном часовом поясе устройства?

Комментарии:

1. вы имеете в виду местное время, установленное на этом конкретном устройстве?

2. Да, местное время на устройстве ios

3. Если вы ожидаете, что date1 будет UTC, тогда используйте форматировщик часовых поясов для date1. dateFormatter.timeZone = NSTimeZone(name: "UTC")

4. На самом деле меня больше беспокоит date2, который я хочу в местном часовом поясе устройства. Как я могу определить местный часовой пояс?

5. Вы делаете неправильно здесь, преобразуйте serverDate в UTC, а затем используйте эту новую дату с вашим местным часовым поясом. Это исправит вашу проблему.

Ответ №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!)
  

Комментарии:

1. О, извините… вы хотели swift 2… это был swift 3. Я обновлю код

2. @Prabhu пожалуйста, ознакомьтесь с обновленным кодом. Я надеюсь, что это поможет

Ответ №2:

Это то же самое, потому что, даже если вы думаете, что устанавливаете часовой пояс средства форматирования даты на текущий часовой пояс после установки первой даты, это не имеет значения. Если вы не задаете часовой пояс средства форматирования даты, оно автоматически устанавливается в системный часовой пояс, как указано в документах Apple для NSDateFormatter :

Если не указано, используется системный часовой пояс.

Следовательно, часовой пояс средства форматирования даты установлен одинаковым как неявно для первой даты, так и явно для второй даты, потому что они совпадают, следовательно, вы получаете ту же дату обратно.

Комментарии:

1. Но независимо от этого, по крайней мере, как 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")