Нахождение количества секунд TAI с 00:00:00 UTC, 1 января 2004 года на Java

Как следует из заголовка, я должен найти количество секунд TAI с 00:00:00 UTC, 1 января 2004 года (на Java). Я только недавно узнал, что такое TAI, и мои попытки выработать вышесказанное немного смутили меня.

Что я пробовал:

Я знаю, на Java вы можете использовать System.currentTimeMillis() получить количество миллисекунд с 1 января 1970 года по Гринвичу ( Javadocs).

Кроме того, из моего краткого исследования атомного времени я понимаю, что в настоящее время TAI на 37 секунд опережает UTC.

Поэтому, мой мыслительный процесс должен был:

  1. Найти количество секунд между 1970 и 2004 годами (34 года)
  2. Вычтите это из текущего времени UTC, чтобы получить число с 2004 года.
  3. Добавьте 37, чтобы получить фактическое количество секунд в TAI

Я не был уверен в математике здесь (1 день = 86400 секунд):

  • Вариант 1: 86400 (секунды) x 365,25 (дни ( 1 юлианский год)) x 34 (годы) = 1 072 958 400
  • Вариант 2: 86400 (секунд) x 365 (дней ( 1 общий год)) x 34 (лет) = 1 072 224 000

В этот момент я начал сомневаться в том, должны ли 37 високосных секунд, добавленные к TAI, учитывать високосные годы по сравнению с UTC, и поэтому мне следует использовать вариант 2. К сожалению, я не уверен, что мой мыслительный процесс правильный, и я решил, что лучше спросить здесь, чтобы убедиться.

Кроме того, я нашел этот цитат, утверждая, что 1 072 915 200 (секунд) эквивалентно 01/01/2004 @ 12:00 утра (UTC). Какой вид меня отбросил, потому что это не равно ни одному из моих расчетов.

1 ответ

Тай-секунды - это, по сути, атомные СИ-секунды, включая високосные секунды. Моя библиотека Time4J поддерживает эту функцию из коробки. Для получения более подробной информации о поддержке TAI см. Также javadoc класса Moment:

Moment m2004 = PlainTimestamp.of(2004, 1, 1, 0, 0).atUTC();
Moment now = SystemClock.currentMoment(); // other clocks based on NTP are possible
long seconds = SI.SECONDS.between(m2004, now);

System.out.println(seconds); // 425222084L
System.out.println(now); // 2017-06-22T13:15:24,570000000Z
Другие вопросы по тегам