Строка на сегодняшний день (неверный формат) - PullRequest
2 голосов
/ 10 июня 2010

Я использую библиотеку Joda-Time для преобразования моих строковых дат в реальную, потому что это казалось самым простым решением для этого. Для этого я использую объект DateTime;

 new DateTime(strValue);

Но при вставке некоторых форматов я получаю исключение;

java.lang.IllegalArgumentException: Invalid format: "Mon, 30 Sep 2002 01:56:02 GMT"
java.lang.IllegalArgumentException: Invalid format: "Sun, 29 Sep 2002 19:59:01 GMT"
java.lang.IllegalArgumentException: Invalid format: "Mon, 30 Sep 2002 01:52:02 GMT"
java.lang.IllegalArgumentException: Invalid format: "Sun, 29 Sep 2002 17:05:20 GMT"
java.lang.IllegalArgumentException: Invalid format: "Sun, 29 Sep 2002 19:09:28 GMT"
java.lang.IllegalArgumentException: Invalid format: "Sun, 29 Sep 2002 15:01:02 GMT"
java.lang.IllegalArgumentException: Invalid format: "Sun, 29 Sep 2002 23:48:33 GMT"
java.lang.IllegalArgumentException: Invalid format: "Sun, 29 Sep 2002 17:24:20 GMT"
java.lang.IllegalArgumentException: Invalid format: "Sun, 29 Sep 2002 11:13:10 GMT"

Есть ли способ решить эту проблему, или я должен использовать что-то другое вместо DateTime.

Ответы [ 3 ]

5 голосов
/ 10 июня 2010

Этот конструктор не является универсальным механизмом интерпретации даты и времени. Ожидаются варианты обычной даты ISO, определенной как YYYY-MM-DDTHH:MM:SS.SSSZ.

Вам нужно будет определить строку формата, которая описывает ваш формат, который затем может быть проанализирован. Это было бы что-то вроде EEE, dd MMM YYYY HH:mm:ss zzz Javadoc здесь!

1 голос
/ 10 июня 2010

Если я правильно помню, используемый здесь парсер по умолчанию ожидает время, отформатированное ISO 8601 , но это не так.В противном случае вам нужно создать собственный DateTimeFormatter .

0 голосов
/ 22 января 2018

ТЛ; др

ZonedDateTime.parse(
    "Mon, 30 Sep 2002 01:56:02 GMT" ,
    DateTimeFormatter.RFC_1123_DATE_TIME
)

2002-09-30T01: 56: 02Z

RFC 1123

Формат ваших строк, например Mon, 30 Sep 2002 01:56:02 GMT, определен в устаревших стандартах RFC 1123 & RFC 822 .

Кстати, это ужасный формат. При сериализации значений даты и времени в текст, вместо этого используйте стандартные форматы ISO 8601 . Вы найдете более новые стандарты и протоколы, принимающие форматы ISO 8601 в настоящее время.

java.time

Проект Joda-Time теперь находится в режиме обслуживания , и команда рекомендует перейти на классы java.time . См. Учебник по Oracle .

Класс java.time DateTimeFormatter имеет встроенный форматер для этого архаичного формата: DateTimeFormatter.RFC_1123_DATE_TIME.

String input = "Mon, 30 Sep 2002 01:56:02 GMT";
DateTimeFormatter f = DateTimeFormatter.RFC_1123_DATE_TIME;

Используйте этот форматер для создания экземпляра объекта ZonedDateTime.

ZonedDateTime zdt = ZonedDateTime.parse( input , f );

Дамп на консоль.

String output = zdt.toString() ;  // Generate a string in standard ISO 8601 format.
System.out.println( "zdt.toString(): " + output );

См. Этот код, запущенный на IdeOne.com .

zdt.toString (): 2002-09-30T01: 56: 02Z


О java.time

Фреймворк java.time встроен в Java 8 и более поздние версии. Эти классы вытесняют проблемные старые устаревшие классы даты и времени, такие как java.util.Date, Calendar и & SimpleDateFormat.

Проект Joda-Time , который теперь находится в режиме обслуживания , рекомендует перейти на классы java.time .

Чтобы узнать больше, см. Oracle Tutorial . И поиск переполнения стека для многих примеров и объяснений. Спецификация JSR 310 .

Где взять классы java.time?

  • Java SE 8 , Java SE 9 и выше
    • Встроенный.
    • Часть стандартного Java API с связанной реализацией.
    • Java 9 добавляет некоторые незначительные функции и исправления.
  • Java SE 6 и Java SE 7
    • Большая часть функций java.time перенесена в Java 6 и 7 в ThreeTen-Backport .
  • Android
    • Более поздние версии Android связывают реализации классов java.time.
    • Для более ранних версий Android проект ThreeTenABP адаптируется ThreeTen-Backport (упоминалось выше). См. Как использовать ThreeTenABP… .

Проект ThreeTen-Extra расширяет java.time дополнительными классами. Этот проект является полигоном для возможных будущих дополнений к java.time. Здесь вы можете найти несколько полезных классов, таких как Interval, YearWeek, YearQuarter и more .

...