joda DateTimeFormatter терпит неудачу с литералом 0 в формате - PullRequest
0 голосов
/ 08 мая 2018
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;

public class DateTest {

    public static void main(String[] args) {
        DateTimeFormatter DF_YYYY_0MM_DD = DateTimeFormat.forPattern("yyyy0MMdd");
        System.out.println(DF_YYYY_0MM_DD.parseLocalDate("201800101"));
    }

}

ожидаем, что выше вернется дата 2018-01-01. Но получите исключение

    Exception in thread "main" java.lang.IllegalArgumentException: Invalid format: "201800101" is too short
    at org.joda.time.format.DateTimeFormatter.parseLocalDateTime(DateTimeFormatter.java:900)
    at org.joda.time.format.DateTimeFormatter.parseLocalDate(DateTimeFormatter.java:844)

1 Ответ

0 голосов
/ 08 мая 2018

Вам необходимо использовать одну цитату для документов .

DateTimeFormatter DF_YYYY_0MM_DD = DateTimeFormat.forPattern("yyyy'0'MMdd");

Хотя это и странно, но в моем тестировании это все равно не работает, из-за того, что в библиотеке похоже на ошибку - в основном isNumericToken(String token) в DateTimeFormat в joda не учитывает числовые литералы. В конечном итоге это приводит к тому, что joda ожидает 9 цифр в году вместо 4.

Таким образом, в качестве обходного пути, вы можете сделать это для создания средства форматирования (а не создавать его непосредственно из строкового шаблона):

DateTimeFormatter DF_YYYY_0MM_DD = new DateTimeFormatterBuilder().appendYear(4,4).appendLiteral("0").appendMonthOfYear(2).appendDayOfMonth(2).toFormatter();

Или префикс вашей даты с 5 нулями (так что теперь год состоит из 9 цифр).

DateTimeFormatter DF_YYYY_0MM_DD = DateTimeFormat.forPattern("yyyy'0'MMdd");
System.out.println(DF_YYYY_0MM_DD.parseLocalDate("00000201800101"));

Или используйте разделитель.

DateTimeFormatter DF_YYYY_0MM_DD = DateTimeFormat.forPattern("yyyy-0-MM-dd");
System.out.println(DF_YYYY_0MM_DD.parseLocalDate("2018-0-01-01"));
...