Проблема в форматировании строки даты Swift 3

Мне нужно преобразовать следующую строку даты в дату в Swift 3.

Fri Dec 09 16:18:43 AMST 2016

Вот код, который я использовал, но он получает деньги за эту конкретную конвертацию строки даты. (Эта дата была зарегистрирована на Android с помощью new Date().toString() Метод.)

static func formatDate(date: String) -> String {
        let dateFormatter = DateFormatter()

        dateFormatter.timeZone = TimeZone(secondsFromGMT: 0)
        dateFormatter.dateFormat = "EEE MMM dd HH:mm:ss zzz yyyy" 
        //Works for "Fri Sep 16 10:55:48 GMT+05:30 2016"

        var myDate = dateFormatter.date(from: date)
        // My date returns nil on "Fri Dec 09 16:18:43 AMST 2016"

        dateFormatter.dateFormat = "dd/MM/yyyy"
        return "\(dateFormatter.string(from: myDate!))"
    }

В базе данных есть оба типа строк. Я пробовал с различными типами форматов часовых поясов (z/zz/zzz/zzzz/zzzzz), но всегда myDate возвращает ноль

Любая помощь будет оценена. Заранее спасибо.

1 ответ

Решение

Apple Doc для TimeZone(abbreviation:):

Как правило, вам не рекомендуется использовать сокращения, за исключением уникальных случаев, таких как "GMT". Сокращения часового пояса не стандартизированы, и поэтому данное сокращение может иметь несколько значений.

Представляет ли AMST "Летнее время Амазонки" (UTC-3) или "Летнее время Армении" (UTC+5)? Смотрите: https://www.timeanddate.com/time/zones

Вероятно, поэтому он не может определить правильный часовой пояс для использования.

Решения, которые я могу предложить:

  1. Если вы знаете, какой часовой пояс AMST:
    • замените AMST на UTC-3 или UTC + 5 в строке даты
    • удалить AMST из строки даты и использовать dateFormatter.timeZone = TimeZone(secondsFromGMT: -3 or 5 * 3600)
  2. Пусть ваш источник выдает более точный часовой пояс.

Обратите внимание на следующий код, где AMST понимается правильно:

let df = DateFormatter()
df.locale = Locale.init(identifier: "pt_BR") // assuming AMST is Amazon Summer Time (UTC -3)
df.dateFormat = "HH:mm:ss z"

print(df.date(from: "16:18:43 AMST")) // Optional(2000-01-01 19:18:43 +0000)

Но как только вы включите английские названия дней или месяцев (например, пятница или декабрь), он выдаст nil (потому что они не на португальском языке).

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