Joda Time возвращает правильную дату, но Java время - нет - PullRequest
1 голос
/ 07 мая 2020

Я поддерживаю большое корпоративное приложение, и у нас есть два класса, которые используют LocalDate.now для получения отметки времени, один использует время joda, другой - время Java. Обычно мы перезапускаемся каждую ночь, но ранее на этой неделе мы не могли этого сделать. На второй день работы приложения класс, использующий время joda, вернул правильную дату (20200505), но класс, использующий Java время, вернул дату включения приложения (20200504).

Оба класса делают новый вызов LocalDate.now в методе каждый раз, когда он вызывается.

Java time:

String date = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));
//Use timestamp

Joda time:

LocalDate date = LocalDate.now();
String format1 = date.toString("MM/dd/yyyy");
//Use date

Почему Java 8 реализация LocalDate. Теперь возвращает неверную дату после изменения даты сервера без перезапуска приложения?

Ответы [ 2 ]

1 голос
/ 07 мая 2020

Класс с проблемой является перечислением, и в другом вызове выясняется, что значение поля в перечислении было изменено и сохранено, поэтому, когда приложение выполняло замену временной метки, заполнитель больше не был в перечисление после первого вызова. Кто знает почему. Исправление этой проблемы устранило проблему, без проблем с Java временем.

0 голосов
/ 07 мая 2020

Местная дата зависит от часового пояса по умолчанию , так как глобальной даты нет. Я предполагаю, что часовой пояс на вашем сервере отключен, и это все еще возвращает вчерашнюю дату в течение нескольких часов после полуночи. Это довольно распространенная ошибка конфигурации при настройке сервера для работы в UT C, в то время как фактический часовой пояс находится ближе к востоку.

https://docs.oracle.com/javase/8/docs/api/java/util/TimeZone.html#getDefault -

Если доступен кэшированный часовой пояс по умолчанию, возвращается его клон. В противном случае метод использует следующие шаги для определения часового пояса по умолчанию.

  • Используйте значение свойства user.timezone в качестве идентификатора часового пояса по умолчанию, если он доступен.
  • Определите платформу идентификатор часового пояса. Источник часового пояса платформы и сопоставления идентификаторов может различаться в зависимости от реализации.
  • Используйте GMT ​​в качестве последнего средства, если заданный или обнаруженный идентификатор часового пояса неизвестен.

Вы можете легко проверить это, получив LocalDate.now() после изменения часового пояса по умолчанию:

TimeZone defaultTimeZone = TimeZone.getDefault();
try {
    Arrays.stream(TimeZone.getAvailableIDs())
        .map(TimeZone::getTimeZone)
        .forEach(timeZone -> {
            TimeZone.setDefault(timeZone);
            System.out.printf("%s in %s (%s)\n",
                LocalDate.now(), timeZone.getID(), timeZone.getDisplayName());
        });
} finally {
    TimeZone.setDefault(defaultTimeZone);
}

Итак, вопрос: какой часовой пояс использует ваш сервер ?

...