Анализ SimpleDateFormat

У меня проблема с SimpleDateFormat:

Ошибка:

Непревзойденная дата: «Чт, 09 ноября 2017 года 16:17:42 GMT»

Код:

DF_SERVER_FORMAT="EEE, dd MMM yyyy HH:mm:ss'Z'" .... var formater=SimpleDateFormat(DF_SERVER_FORMAT) formater.parse(source) 

согласно документации SimpleDateFormat , Z (с заглавной буквы) используется для часового пояса RFC 822 , например -0800

для использования общего часового пояса z .

это должно работать:

DF_SERVER_FORMAT="EEE, dd MMM yyyy HH:mm:ss z"

Попробуйте "EEE, d MMM yyyy HH:mm:ss z" этот шаблон работает для меня.

Вы можете попытаться отформатировать дату, используя ваш шаблон, чтобы увидеть разницу, а затем исправить свой шаблон соответственно. Вот что я сделал в J2SE:

 SimpleDateFormat df = new SimpleDateFormat("EEE dd MMM yyyy HH:mm:ss'Z'"); System.out.println(df.format(new Date())); 

Это производит:

Чт 09 ноя 2017 17: 49: 07Z

Но, когда я использовал шаблон « EEE, dd MMM yyyy HH: mm: ss z », он дал ожидаемый результат:

Thu, 09 Nov 2017 17:51:09 CET

Для любого, кто либо хорошо связан с внешней зависимостью (временно), либо использует Java 8 или более позднюю версию, я хотел бы внести современный ответ. Потому что я считаю SimpleDateFormat устаревшим.

Современный API дат и времени Java, как правило, гораздо приятнее для работы. Кроме того, ваша строка находится в формате RFC 1123, а современный API поставляется с форматом для этого формата. Так что вам не нужно самостоятельно строить строку шаблона шаблона (мой код – это чистая Java, я надеюсь, что вы примете его в Котлин):

  String dateString = "Thu, 09 Nov 2017 16:17:42 GMT"; OffsetDateTime dateTime = OffsetDateTime.parse(dateString, DateTimeFormatter.RFC_1123_DATE_TIME); 

Это дает значение OffsetDateTime 2017-11-09T16:17:42Z как и ожидалось.

Чтобы использовать это на Android, получите ThreeTenABP , см. Этот вопрос: Как использовать ThreeTenABP в Android Project . Java 8 и более поздние версии поставляются с современным API-интерфейсом. Если вы используете Java 6 или 7 на не-Android, вам нужен ThreeTen Backport .

Что пошло не так в коде? С вашей строкой шаблона формата вы запрашивали буквальный Z сразу после секунд, без пробела между ними. Поскольку в вашей строке ввода не было Z , синтаксический анализ не удался (вместо этого у него было пробел и идентификатор смещения GMT ). Кроме того, ваш код, по-видимому, чувствителен к языку: если ваш языковой стандарт по умолчанию – это тот, где аббревиатура для четверга не является Thu или ноябрь, но не Nov, синтаксический анализ не будет выполнен (в отличие от RFC_1123_DATE_TIME ожидает (и требует) сокращений дня и месяца в Английский, независимо от языка).

Intereting Posts
Есть ли допустимое правило proguard для RxJava и FasterXML? Неопределенность разрешения перегрузки по числу лямбда-параметров Kotlin и идиоматический способ писать, «если не null, else …», основанный на изменяемой ценности Что такое интеграция интеграции с переходом на глиссирование? Компилировать Groovy и Kotlin? Kotlin – Как создать функцию псевдонима RxJava flatmap ()? Sugar ORM, Список всех в Котлин? Java работает, но Kotlin не Почему для цикла с тремя точками компилируется? Как передать параметр типа в ссылку на общий конструктор класса? Kotlin: Блокировка сопрограмм с неблокирующими ввода-выводами Ошибка плагина: Котлин бросил исключенное исключение NoReadAccessException Kotlin переопределяет забаву с подтипом Тип несоответствия предполагаемого типа – Unit, но ожидалось, что Void Ошибка сборки приложения Kotlin из-за «Не удалось инициализировать класс com.intellij.ide.highlighter.JavaFileType» Котлин, проблема создания экземпляров и общий