2016-11-28 11 views
0

Я знаю, что есть много потоков, но я не могу найти решение для своей проблемы. Может быть, я не вижу решения ...UTC по местному времени - неверный результат swift

Я получаю UTC Время: например, 12:50 Я хочу преобразовать это время в MEZ соответственно в часовой пояс устройства пользователя. Для моего примера я ожидаю 13:50, потому что atm - MEZ +1 к UTC.

Это мой код

//transform date to string 
    let dateFormatter = DateFormatter() 
    dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss" 
    dateFormatter.timeZone = TimeZone(abbreviation: "UTC") 
    let newDateAsString:String = dateFormatter.string(from: self) 
    //is 12:50 UTC 

    //transform date to MEZ respectively to the local device timezone 
    let dateFormatterToDate = DateFormatter() 
    dateFormatterToDate.dateFormat = "yyyy-MM-dd'T'HH:mm:ss" 
    let timeZone = TimeZone.autoupdatingCurrent.identifier as String 
    dateFormatter.timeZone = TimeZone(identifier: timeZone) 
    //same result with: dateFormatter.timeZone = NSTimeZone.local 

    //result is 11:50 but i would expect 13:50 
    if let result = dateFormatterToDate.date(from: newDateAsString) { 
     return result 
    } 

Результат 11:50 это время в моей текущей временной зоны. Но я этого не понимаю. Я даю явно дату, которая должна быть конвертирована. Кто-нибудь знает, где моя ошибка?

ответ

1

Преобразование, которое вы делаете, противоположно тому, что вы намерены. Строка newDateAsString, которая дает время как 12:50, не указывает часовой пояс, потому что ваша строка формата даты не включает форматирование для часового пояса. Когда вы устанавливаете часовой пояс dateFormatterToDate в MEZ и пройдите newDateAsString до dateFormatterToDate, вы говорите: дайте мне Date объект на 12:50 в MEZ.

По умолчанию Даты отображаются как UTC, поэтому result отображается как 11:50, так как 12:50 в MEZ - 11:50 в UTC.

Чтобы отформатировать дату в виде строки в локальной временной зоне вы должны использовать такой код:

let dateFormatter = DateFormatter() 
dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss" 
dateFormatter.timeZone = NSTimeZone.local 
let localTimeZoneDateString = dateFormatter.string(from: self)