Календарные секунды обслуживаются високосными секундами?

Есть ли у високосных секунд класс GregorianCalendar?

Если нет, то какая-нибудь сторонняя библиотека обслуживает это?

2 ответа

Решение

API java.util.Date говорит, что

"... хотя класс Date предназначен для отражения координированного универсального времени (UTC), он может делать это не совсем точно, в зависимости от среды хоста виртуальной машины Java.... Большинство часов компьютера недостаточно точны, чтобы иметь возможность чтобы отразить разницу високосного ".

Вики говорит

"Поскольку скорость вращения Земли изменяется в зависимости от климатических и геологических явлений, високосные секунды UTC расположены нерегулярно и непредсказуемо. Установка каждой високосной секунды UTC обычно определяется за шесть месяцев вперед Международной службой вращения Земли и систем отсчета (IERS)"

то есть ни один класс не может знать о будущих решениях IERS.

  1. GregorianCalendar не учитывает високосные секунды (это видно из представления исходного кода в Oracle - здесь всегда дается явное предположение 1 минута = 60 секунд). И более того: Oracle официально отказала в високосной поддержке - см. Bug-ID 4272347.
  2. В Java нет стандартной сторонней библиотеки, поддерживающей високосные секунды - даже не joda-time. Это делает только специализированное программное обеспечение.
  3. Обратите внимание, что многие библиотеки говорят о високосных секундах, хотя и не поддерживают, например, java.util.Date (см. Ответ Дорофеева). Также JSR 310 много говорит, но не поддерживает эту функцию. Официально JSR 310 поддерживает UTC-SLS, которая не считает високосные секунды и описывает только размытие резиновых секунд вокруг события високосной секунды. Действительно, JSR 310 очень сбивает с толку, поддерживает ли он время UNIX или UTC-SLS (см. Следующий пункт). А поскольку информация о високосных секундах ( https://github.com/threeten/threeten/issues/197) была удалена из кодовой базы JSR 310, абсолютно невозможно реализовать истинные UTC-секунды в рамках JSR 310. В лучшем случае можно ожидать появления внешнего модуля ( Threeten-Extra) в качестве дополнения к JSR 310, который в лучшем случае обеспечит элементарную поддержку (это скорее перевод времени UNIX и шкалы времени TAI, а не больше и использует, на мой взгляд, принципиально неправильную модель предметной области).
  4. System.currentTimeMillis() официально относится к таймеру ОС. И поскольку все известные мне ОС, включая Microsoft, Linux и Apple, основаны только на спецификации UNIX, этот системный таймер Java не считает високосные секунды, а только обычные миллисекунды с 1970-01-01T00:00:00.000Z
  5. Из-за всех этих фактов я решил создать свою собственную библиотеку Java даты и времени с именем Time4J, которая полностью поддерживает високосные секунды и доступна как v1.0 с LGPLv2.1-лицензией. Статья dzone демонстрирует, как эта поддержка выглядит в версии v4.2.
Другие вопросы по тегам