Swift datefomatter возвращает неправильное время - PullRequest
0 голосов
/ 05 августа 2020

Я работаю в приложении iOS с Dateformatter, которое возвращает неправильное время. Я не знаю, как это исправить. Может ли кто-нибудь исправить меня, чтобы получить правильное время?

let dateString = "2020-08-11T05:32:33.000Z"

func approach1(){
    
    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSXXXXX"
          
    guard let date = dateFormatter.date(from: dateString) else {fatalError()}
    
    printTime(date: date)
}

func approach2(){
    
    let dateFormatter = ISO8601DateFormatter()
    dateFormatter.formatOptions = [.withInternetDateTime, .withFractionalSeconds]
    guard let date = dateFormatter.date(from: dateString) else { fatalError()}
      
    printTime(date: date)
}

func printTime(date: Date){
    
    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "h:mm a"
    dateFormatter.amSymbol = "AM"
    dateFormatter.pmSymbol = "PM"
    let time  = dateFormatter.string(from: date)

    print("date: \(date)")
    print("Time: \(time)") // Here it's always wrong time with those approach.
}

Текущий результат:

введите описание изображения здесь

Ответы [ 3 ]

1 голос
/ 05 августа 2020

Нет ничего плохого. Средство форматирования даты возвращает правильное время

Строка даты

«2020-08-11T05: 32: 33.000Z»

представляет дату в UT C (+ 0000).

Ваш местный часовой пояс, очевидно, UTC + 0530. DateFormatter по умолчанию учитывает местный часовой пояс.

Чтобы отформатировать time также в UT C, вы должны явно указать часовой пояс средства форматирования даты

func printTime(date: Date) {
    
    let dateFormatter = DateFormatter()
    dateFormatter.timeZone = TimeZone(identifier: "UTC")
    dateFormatter.dateFormat = "h:mm a"
    dateFormatter.amSymbol = "AM"
    dateFormatter.pmSymbol = "PM"
    let time  = dateFormatter.string(from: date)

    print("date: \(date)")
    print("Time: \(time)")
}
1 голос
/ 05 августа 2020

По умолчанию dateFormatter работает с местным часовым поясом. Для правильного отображения установите часовой пояс на UT C: dateFormatter.timeZone = TimeZone (сокращение: «UT C»)

1 голос
/ 05 августа 2020

Вам необходимо указать часовой пояс при форматировании в строку (по умолчанию используется ваш текущий местный часовой пояс):

func printTime(date: Date) {
    let dateFormatter = DateFormatter()
    dateFormatter.timeZone = TimeZone(abbreviation: "UTC") // <- add here
    dateFormatter.dateFormat = "h:mm a"
    dateFormatter.amSymbol = "AM"
    dateFormatter.pmSymbol = "PM"
    let time = dateFormatter.string(from: date)

    print("date: \(date)")
    print("Time: \(time)")
}
...