Давайте посмотрим на исходный код java.util.Date
:
public Date() {
this(System.currentTimeMillis());
}
Таким образом, вопрос можно прочитать так:
Будет ли System.currentTimeMillis()
давать значение дополнительной секунды 60 или даже 61 (как утверждает спецификация)?
Ответ в строгом смысле: это зависит от базовой операционной системы. Но факт в том, что все известные операционные системы, такие как Windows, Linux, Apple, Android, игнорируют дополнительные секунды. Вместо этого эти операционные системы производят любые манипуляции с часами в любое время (перевод назад и т.д., синхронизация с NTP-сервером...). Поэтому при использовании Date
-API вы не заметите високосную секунду. Кстати, значение 61 невозможно, потому что стандарт UTC предписывает, что UTC никогда не будет отклоняться от UT1 более чем на 0,9 секунды с последствиями что двойная дополнительная секунда не будет вставлена.
Происхождение "61" - просто грубое недоразумение из ранних спецификаций POSIX (где эта ошибка была исправлена). К сожалению, старая спецификация Java до сих пор не исправлена, вызывая недопонимание.
О Java-8:
Да, так называемая «Шкала времени Java» формально указана как UTC-SLS — на основе предложения с истекшим сроком действия, намерение которого было скорее направлено на внутреннюю реализацию NTP-серверов. В реальном мире не существует реализации UTC-SLS. Даже Java-8 не реализует UTC-SLS. Два факта подтверждают это утверждение:
Java-8 не содержит таблицы високосных секунд (которая была бы основой любой реализации UTC-SLS). В проекте Threeten изначально был такой, но он был удален (теперь также удален из резервной копии).
Преобразование из java.util.Date
в Instant
составляет всего 1:1 (см. исходный код, не считая разной точности в миллисекундах и нано). Обратите внимание, что java.util.Date
не упоминается в API Instant
в отношении так называемой «шкалы времени Java».
Шкала времени Java используется для всех классов даты и времени. Сюда входят Instant, LocalDate, LocalTime, OffsetDateTime, ZonedDateTime и Duration.
Кроме того: происхождение java.util.Date
относится к 1995 году (когда была изобретена Java), но UTC-SLS был предложен несколько лет спустя.
Так что же осталось в Java-8 в качестве поддержки дополнительных секунд? Пустые слова в спецификации, вызывающие много путаницы, не более того.
Что еще можно сделать? В рамках JDK просто ничего. Что вам нужно, так это внешняя сторонняя библиотека со встроенными данными о дополнительных секундах. Примером может служить моя библиотека Time4J — см. эту статью. Другим вариантом может быть библиотека Threeten-Extra с классом UTCInstant. Но я не проверял его преобразование в java.util.Date
(кажется подозрительным?).
person
Meno Hochschild
schedule
01.07.2015