Неправильные результаты при добавлении миллисекунд к объекту java .util.date - PullRequest
1 голос
/ 04 апреля 2020

Текущее время: Sat Apr 04 15:02:00 AEST 2020.

. В следующем фрагменте я создаю объект Date и добавляю к нему 86400000L миллисекунд (1 день):

Date date = new Date();
date.setTime(date.getTime() + 86400000L);
System.out.println(date);

Выходные данные Sun Apr 05 14:02:00 AEST 2020. Я не понимаю, почему результат добавляет к моему текущему времени всего 23 часа вместо 24 часов.

Буду признателен за любую помощь.

Ответы [ 2 ]

2 голосов
/ 04 апреля 2020

Код работает просто отлично. AEST на вашем выходе означает, что дата относится к Australian Eastern Standard Time. Поиск в Google для AEST dst показывает, что в воскресенье, 5 апреля, в 3:00 утра 2020 года часы будут "go назад" на 1 час. Таким образом, добавление 24 часов непосредственно перед сменой DST приведет к сдвигу времени только на 23 часа.

Если вы запустите этот код завтра, у вас не будет этой «проблемы».

1 голос
/ 04 апреля 2020

Используйте java .time, современный Java API даты и времени, для вашей работы с датой и временем.

    ZonedDateTime currentTime = ZonedDateTime.now(ZoneId.of("Australia/Sydney"));
    System.out.println(currentTime);
    ZonedDateTime tomorrowSameTime = currentTime.plusDays(1);
    System.out.println(tomorrowSameTime);

Вывод при запуске только сейчас:

2020-04-04T16:00:30.579484+11:00[Australia/Sydney]
2020-04-05T16:00:30.579484+10:00[Australia/Sydney]

Обратите внимание: завтра у нас такое же время, 16:00. Поскольку летнее время (летнее время) заканчивается, смещение UT C на завтра будет другим: +10: 00 вместо +11: 00. И что важно, хотя я нахожу + 86400000L довольно близким к нечитаемому для добавления дня, .plusDays(1) очень четко передает намерение.

Пожалуйста, укажите другой часовой пояс Восточной Австралии, если требуется.

Что пошло не так в вашем коде? Черувим очень хорошо объяснил это в другом ответе, мне не нужно повторяться. Позвольте мне лишь добавить, что класс Date не только плохо спроектирован, что порождает ваше замешательство, но и давно устарел. Я рекомендую вам не использовать его. И, как замечает черувим в комментарии, программирование с датами сложно. Не верьте, что вы можете сами конвертировать 1 день в 86 400 000 миллисекунд. Оставьте все вычисления даты и времени проверенным библиотечным методам.

Ссылка: Oracle учебник: Дата и время , объясняющие, как использовать java .time.

...