#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")