Давайте посмотрим на исходный код java.util.Date
:
public Date() {
this(System.currentTimeMillis());
}
Так что вопрос может быть прочитана как:
Will System.currentTimeMillis()
дают скачок второе значение 60 или даже 61 (как спецификация делает вид)?
Ответ в строгом смысле: это зависит от базовой операционной системы. Но факт в том, что все известные операционные системы, такие как Windows, Linux, Apple, Android, не знают о секундах. Вместо этого эти операционные системы выполняют любые манипуляции с часами в любое время (настройка и т. Д., Синхронизация с NTP-сервером ...). Таким образом, вы не будете наблюдать скачок секунды, используя Date
-API. Между прочим, значение 61 невозможно, потому что UTC-стандарт предусматривает, что UTC никогда не будет отклоняться от UT1 более чем на 0,9 секунды, вследствие чего не будет вставлен двойной прыжок.
Происхождение «61» - просто грубое недоразумение из ранних спецификаций POSIX (где эта ошибка была исправлена сейчас). К сожалению, старая Java-спецификация еще не исправлена, вызвав недоразумения до сих пор.
О Java-8:
Да, так называемый "Java Time-Scale" формально определяется как UTC-SLS - на основе выдыхаемого предложение которого цель была скорее направлена на внутренних реализаций NTP -servers. В реальном мире нет реализации UTC-SLS. Даже Java-8 не реализует UTC-SLS. Два факты доказывают это утверждение:
Java-8 не содержит второй прыжок таблицу (которая будет основой любых UTC-SLS-реализация). Первоначально проект Threeten был проведен таким образом, но был удален (теперь также removed from the backport).
Преобразование из java.util.Date
в Instant
составляет всего 1: 1 (см. Исходный код - оставляя в стороне различную точность миллисов против нано).Обратите внимание, что java.util.Date
не упоминается в API Instant
относительно так называемой «Шкалы времени Java».
Java-временная шкала используется для всех классов даты и времени. Это включает Мгновенный, LocalDate, LocalTime, OffsetDateTime, ZonedDateTime и Продолжительность.
Кроме того: происхождение java.util.Date
происходит с 1995 года (когда была изобретена Java), но UTC-SLS был предложен несколько лет спустя.
Итак, что осталось в Java-8 как поддержка второго уровня? Пустые слова в spec вызывают много путаницы, больше ничего.
Что вы можете сделать еще? В рамках JDK просто ничего. Вам нужна внешняя сторонняя библиотека со встроенными данными второго уровня. Примером может служить моя библиотека Time4J - см. Это article. Другим вариантом может быть библиотека Threeten-Extra со своим классом UTCInstant. Но я не протестировал его преобразование в java.util.Date
(кажется, подозревается?).
Java SE 8 четко определяет поведение второго уровня здесь: https://docs.oracle.com/javase/8/docs/api/java/time/Instant.html –
Я не думаю, что такой метод, как * leap smear * будет квалифицироваться как правильное представление секунды прыжка, но это определенно допустимый способ обработки секунд прыжка, по крайней мере, в контексте сервера/базы данных: http://stackoverflow.com/questions/19751115/leap-second-handling- in-database/19756183 # 19756183 – Sandman