В миллисекундах системы Java учитываются дополнительные секунды?
Система Java-функции.currentTimeMillis(), по-видимому, возвращает количество секунд с 1 января 1970 года. Однако, согласно http://en.wikipedia.org/wiki/Leap_second, с 1972 года было 25 високосных секунд. Это означает, что фактическое количество секунд с 1 января 1970 года было на 25 больше, чем предполагал наивный расчет. СистемаcurrentTimeMillis() делать наивный расчет и игнорировать високосные секунды?
5 ответов
Официально дело за ОС и реализацией - хотя бы для Date
, Из документов java.util.Date
:
Хотя класс Date предназначен для отражения координированного универсального времени (UTC), он может делать это не совсем точно, в зависимости от среды хоста виртуальной машины Java. Почти все современные операционные системы предполагают, что 1 день = 24 × 60 × 60 = 86400 секунд во всех случаях. В UTC, однако, примерно раз в год или два появляется дополнительная секунда, называемая "високосной секундой". Дополнительная секунда дня всегда добавляется как последняя секунда дня и всегда 31 декабря или 30 июня. Например, последняя минута 1995 года была длиной 61 секунда, благодаря добавленной дополнительной секунде. Большинство компьютерных часов недостаточно точны, чтобы отразить разницу в секунду.
Я подозреваю, что вы обнаружите, что, хотя часы вашего компьютера примерно совпадают с UTC, это делается через NTP или тому подобное, периодически корректируя время, а не ОС, реализующую високосные секунды.
Я полагаю, что библиотеки JRE обычно принимают 86400-секундный день. Это делает жизнь намного проще, и если вы все равно собираетесь исправлять неточные системные часы, вы также можете исправить и високосные секунды.
Вы действительно хотите разобраться в том, что вас интересует. Если вам нужен способ представления даты и времени, которые используют дополнительные секунды, стандартные библиотеки Java могут не работать для вас. Насколько я могу судить, даже JSR-310 больше не поддерживает високосные секунды (что является очень разумным решением для большинства разработчиков).
POSIX требует, чтобы системные часы не допускали наличия дополнительных секунд. MS Windows не может гарантировать качество (или существование) оборудования системных часов, и она отказалась от гарантии точности в 1 секунду. Java не может легко сделать то, что отказывается делать базовая система. Операционные системы сталкиваются с историей международных правил, в результате которой один стандарт IEEE (PTP) требует дополнительных секунд, а другой (POSIX) - их отрицание.
Один простой способ проверить, учитываются ли дополнительные секунды или нет, состоит в том, чтобы вычислить количество секунд, прошедших с начала эпохи, до 00:00 в любой день текущего года.
Если это количество секунд соответствует 00 по модулю 60, то дополнительные секунды не учитываются, так как в 2013 году у вас должен быть модуль 25 (для учета последних 25 дополнительных секунд).
Я сделал небольшой эксперимент на javarepl:
java> new Date(1000L * 86400 * (365 * 4 + 1) * 12)
java.util.Date res0 = Mon Jan 01 00:00:00 UTC 2018
Как видите, используется простая "наивная" арифметика, которая касается только високосного года, а не високосных секунд. Никаких дополнительных секунд не добавляются и не вычитаются.
Обновить:
То же самое для нового Instant
учебный класс:
java> Instant.ofEpochMilli(1000L * 86400 * (365 * 4 + 1) * 12)
java.time.Instant res0 = 2018-01-01T00:00:00Z
Глядя на Javadoc для currentTimeMillis(), он ссылается на документацию класса Date, в которой говорится следующее:
Хотя класс Date предназначен для отражения координированного универсального времени (UTC), он может делать это не совсем точно, в зависимости от среды хоста виртуальной машины Java. Почти все современные операционные системы предполагают, что 1 день = 24 × 60 × 60 = 86400 секунд во всех случаях. В UTC, однако, примерно раз в год или два появляется дополнительная секунда, называемая "високосной секундой". Дополнительная секунда дня всегда добавляется как последняя секунда дня и всегда 31 декабря или 30 июня. Например, последняя минута 1995 года была длиной 61 секунда, благодаря добавленной дополнительной секунде. Большинство компьютерных часов недостаточно точны, чтобы отразить разницу в секунду.
Итак, чтобы ответить на ваш вопрос: да, учитываются дополнительные секунды.