Установите пользовательский часовой пояс в DateFormatterTransform в ObjectMapper

Я относительно новичок в разборе временных строк ObjectMapper и столкнулся с огромной проблемой. У меня есть сервер, отправляющий мне временную строку в формате "гггг-ММ-дд'ТЧЧ: мм: сс.ССЗ", которую я должен проанализировать в своем объекте Date локально. Мой сервер отправляет мне дату в местном часовом поясе, то есть GMT+8, поэтому предположим, что я получаю "2018-08-23T15:02:44.000Z" с сервера. Мне нужно сохранить это именно так, как это в моем файле области. Я использую следующий код для преобразования:

let formatter = DateFormatter()
formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSZ"
formatter.timeZone = TimeZone.current
recordDateTime <- (map["record_time"], DateFormatterTransform(dateFormatter: formatter))

Но проблема в том, что объект даты, сохраняемый в области, - 2018-08-23 11:02:44 PM. Я считаю, что DateFormatterTransform принимает строки даты в зоне GMT, и, таким образом, он конвертирует ее в мой местный часовой пояс, т.е. GMT+8. В любом случае я могу установить часовой пояс для DateFormatterTransform вручную, чтобы я не получил сдвиг времени? Мы не можем изменить сервер в данный момент времени, так как база данных достаточно велика и уже хранит каждую дату в местном часовом поясе.

Подскажите пожалуйста, как решить эту проблему. Спасибо

1 ответ

Решение

Нашел это самое быстрое решение: написал пользовательский форматер даты, который бы вычитал смещение по Гринвичу в методе date(from: String). Это фрагмент кода:

class MyDateFormatter : DateFormatter {

required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
}

override init() {
    super.init()
}

override func date(from string: String) -> Date? {
    return super.date(from:string)?.addingTimeInterval(-8*60*60)
}

}

Другие вопросы по тегам