Иногда при работе с датами и временем в Java можно столкнуться с неожиданными результатами. Особенно это касается разницы во времени между двумя моментами. Рассмотрим на примере.
Представим, что есть два момента времени, отличающихся на 1 секунду. Например, «1927-12-31 23:54:07» и «1927-12-31 23:54:08». Ожидается, что разница между ними будет одна секунда, но при вычислении разницы в миллисекундах и последующем делении на 1000 для получения количества секунд, результат может удивить — 353 секунды.
Для понимания причины такого поведения необходимо знать о существовании исторических изменений в стандартах времени. В истории были периоды, когда происходили корректировки времени, включая введение или отмену летнего времени, изменение часовых поясов и даже введение «лишних» секунд — так называемых «секунд скачка».
В данном случае результат в 353 секунды связан с тем, что в Китае, где установлен часовой пояс «Asia/Shanghai», 31 декабря 1927 года было введено декретное время. Из-за этого в 23:54:03 произошел «скачок» вперед на 5 минут и 52 секунды.
Java учитывает эти исторические изменения во времени, и поэтому при работе с датами и временем важно учитывать, что разница между двумя моментами времени может быть не такой, как ожидается.
В целом, при работе с датами и временем рекомендуется использовать классы из пакета java.time, которые более удобны и предсказуемы, чем устаревшие классы Date и SimpleDateFormat.
Добавить комментарий