Порок развития йодатима, даже если он выглядит правильно - PullRequest
3 голосов
/ 13 июня 2019

У меня есть этот кусок кода

DateTimeFormatter dtf = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss Z");
DateTime dateNow = dtf.parseDateTime(new DateTime().toString());
String registerDateStr = dateNow.toString();

Но когда я запускаю его, он говорит о неправильной дате:

java.lang.IllegalArgumentException: неверный формат: «2019-06-13T17: 57: 47.420 + 08: 00» искажен при «.420 + 08: 00»

Сформированная дата мне кажется верной? Я что-то не так сделал с форматом?

Ответы [ 3 ]

1 голос
/ 13 июня 2019

Результат не должен быть

DateTimeFormatter dtf = DateTimeFormat.forPattern ("гггг-ММ-дд'Т'ЧЧ: мм: сс.СССЗ");

из javadoc,

Symbol         Meaning                     Presentation      Examples  
------      -------                     ------------      -------

   H       hour-of-day (0-23)          number            0
   m       minute-of-hour              number            30
   s       second-of-minute            number            55
   S       fraction-of-second          fraction          978

Ваш формат гггг-ММ-дд'Т'ЧЧ: мм: сс Z не работал, потому что вы пропустили S (доля секунды, которая присутствует в вашей строке как.420)

1 голос
/ 13 июня 2019

Ты слишком много работаешь.Вам вообще не нужен явный форматер.

    DateTime dateNow = new DateTime();
    String registerDateStr = dateNow.toString();

    System.out.println(registerDateStr);

Вывод, когда я только что запустил:

2019-06-13T13: 04: 48.301 + 02: 00

Если вы хотите, вы также можете проанализировать строку обратно без средства форматирования, но я не вижу причин, почему вы должны это делать, поскольку вы просто получите объект DateTime, равный тому, с которого вы начали:

    DateTime parsedBack = DateTime.parse(registerDateStr);
    System.out.println(parsedBack);

2019-06-13T13: 04: 48.301 + 02: 00

Знали ли вы?

Обратите внимание, что Йода- Время считается во многом «законченным» проектом.Никаких серьезных улучшений не планируется.Если используется Java SE 8, перейдите на java.time (JSR-310).

Цитируется с домашней страницы Joda-Time

1 голос
/ 13 июня 2019

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

Этот формат будет работать:

DateTimeFormatter dtf = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
...