Я переношу существующее приложение из Joda-Time в Java 8 java.time
.
У меня возникла проблема, при которой синтаксический анализ строки даты/времени, содержащей значение "день недели", вызвал исключение в моих модульных тестах.
При анализе:
2016-12-21 20:50:25 Среда Декабрь +0000 3
с использованием формата:
yyyy'-'MM'-'dd' 'HH':'mm':'ss' 'EEEE' 'MMMM' 'ZZ' 'e
Я получаю:
java.time.format.DateTimeParseException:
Text '2016-12-21 20:50:25 Wednesday December +0000 3'
could not be parsed: Conflict found:
Field DayOfWeek 3 differs from DayOfWeek 2 derived from 2016-12-21
Если DateTimeFormatter
указать, что он ожидает:
String logline = "2016-12-21 20:50:25 Wednesday December +0000";
String format = "yyyy'-'MM'-'dd' 'HH':'mm':'ss' 'EEEE' 'MMMM' 'ZZ";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(format).withLocale(Locale.ENGLISH);;
ZonedDateTime dateTime = formatter.parse(logline, ZonedDateTime::from);
format = "yyyy'-'MM'-'dd' 'HH':'mm':'ss' 'EEEE' 'MMMM' 'ZZ' 'e";
formatter = DateTimeFormatter.ofPattern(format).withLocale(Locale.ENGLISH);
System.out.println(formatter.format(dateTime));
Теперь я получаю этот вывод:
2016-12-21 20:50:25 Wednesday December +0000 4
Таким образом, основная причина проблемы заключается в том, что флаг e
в Joda-Time считает, что понедельник 1
, но Java 8 java.time
считает понедельник 0
.
Теперь для шаблонов, поддерживаемых java.time.DateTimeFormatter
, я нахожу в документацию Oracle и в JSR-310:
e/c localized day-of-week number/text 2; 02; Tue; Tuesday; T
Этот явный пример 2
и 'Tuesday' заставляет меня думать, что среда также должна быть в java.time be 3
вместо 4
.
Что здесь не так? Не понимаю ли я? Является ли это ошибкой в Java 8?