2015-12-03 5 views
2

У меня есть запрос json, который может создавать два разных типа значений времени. Оба способа - это время UTC, но мне нужно преобразовать его в локальное время.Быстрое значение времени json для местного часового пояса

2015-12-01T13:05:33+00:00 

или

1:05:33 PM 

Моя попытка.

let dateFormatter = NSDateFormatter() 
dateFormatter.timeStyle = NSDateFormatterStyle.ShortStyle //Set time style 
dateFormatter.timeZone = NSTimeZone() 
let localDate: NSDate? = dateFormatter.dateFromString(time1) 
print(localDate) 

Это то, что я получаю в результате. 2000-01-01 19:05:33 +0000, если я использую значение 1:05:18 PM.

Линия для получения значения json.

let time1 = json["results"]["time1"].string! 

ответ

1

ОК, пару вещей вещей:

  1. Синтаксический, что RFC 3339/ISO 8601 строку:

    let string = "2015-12-01T13:05:33+00:00" 
    
    let rfc3339Formatter = NSDateFormatter() 
    rfc3339Formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZ" 
    rfc3339Formatter.locale = NSLocale(localeIdentifier: "en_US_POSIX") 
    let date = rfc3339Formatter.dateFromString(string) 
    

    Обратите внимание, я установил локаль (как на Technical Q&A 1480). Но поскольку строка даты включала информацию о часовом поясе, я могу использовать символ форматирования Z, чтобы часовой пояс был правильно интерпретирован.

  2. Но NSDate объектов не имеют связанный с ними часовой пояс. Фактически, если мы делаем print(date), что мы успешно проанализировали на предыдущем шаге, он покажет нам, что NSDate в GMT/UTC, даже если эта оригинальная строка была в другом часовом поясе.

    Часовой пояс имеет смысл только при использовании форматирования для преобразования этого NSDate обратно в новую строку, которая будет представлена ​​пользователю. Таким образом, мы можем использовать отдельный форматировщик для создания строки вывода:

    let userDateFormatter = NSDateFormatter() 
    userDateFormatter.dateStyle = .MediumStyle 
    userDateFormatter.timeStyle = .MediumStyle 
    let outputString = userDateFormatter.stringFromDate(date!) 
    

    Поскольку это не определяет часовой пояс, это создаст строку в локальном часовом поясе пользователя. И поскольку мы не переопределяем locale и используем .dateStyle и .timeStyle, он отображает его с использованием текущих настроек локализации устройства при создании строки, которая будет представлена ​​конечному пользователю.

  3. Теперь, если вы действительно получаете время в UTC (без учета часового пояса ?!Хлоп, что это действительно плохой дизайн, чтобы увидеть, что в JSON, ИМХО), то вы должны указать временные зоны:

    let string = "1:05:33 PM" 
    
    let utcTimeStringFormatter = NSDateFormatter() 
    utcTimeStringFormatter.dateFormat = "hh:mm:ss a" 
    utcTimeStringFormatter.timeZone = NSTimeZone(forSecondsFromGMT: 0) 
    let time = utcTimeStringFormatter.dateFromString(string) 
    

    Теперь, когда мы имеем time, NSDate, содержащий время, представленное этой строкой. Но опять же, NSDate объектов, сами, не имеют часового пояса. Только тогда, когда мы преобразуем, что обратно в строку для конечного пользователя, мы увидим время в местном часовом поясе:

    let userTimeFormatter = NSDateFormatter() 
    userTimeFormatter.timeStyle = .MediumStyle 
    let outputString = userTimeFormatter.stringFromDate(time!) 
    
+0

Это была большая помощь. Благодарим вас за обращение к обоим форматам. Я смог заставить его работать в любом формате. Теперь все, что мне нужно, чтобы отредактировать код, чтобы я мог повторно использовать его все время в json-файле. – MwcsMac

+0

Ключ при повторном использовании его при разборе JSON заключается в сохранении объектов 'NSDateFormatter', поэтому вы не повторяете их повторно. (Так, например, избегайте создания расширения, которое создает экземпляр формата даты каждый раз, когда вы вызываете этот метод.) Процесс создания 'NSDateFormatter' (или даже изменения' dateFormat'/'dateStyle' /' timeStyle') относительно дорогая, – Rob

0

Вы можете просто попробовать, установив локальный часовой пояс или установив GMT

formatter.timeZone = NSTimeZone.localTimeZone() 

ИЛИ

formatter.timeZone = NSTimeZone(abbreviation: "GMT") 

Позвольте мне знать, если вы все еще сталкиваются ошибки !

Смежные вопросы