где високосные секунды в JavaScript? - PullRequest
0 голосов
/ 27 октября 2018

Когда я использую

  • пользовательский файл zoneinfo для TAI или / usr / share / zoneinfo-leaps и
  • модифицированного клиента NTP (в настоящее время этопросто добавляет 27 секунд и ждет отметку времени, которая составляет около 1 секунды)

на моем компьютере ArchLinux, системное время ведет себя хорошо:

> date
Tue Oct 23 17:10:34 TAI 2018
> date -d @1483228827
Sun Jan  1 00:00:00 UTC 2017
> date -d @1483228826
Sat Dec 31 23:59:60 UTC 2016
> date -d @1483228825
Sat Dec 31 23:59:59 UTC 2016

но: JavaScriptне:

-arne

1 Ответ

0 голосов
/ 28 октября 2018

Объект JavaScript Date специально придерживается концепции Unix Time (хотя и с более высокой точностью).Это является частью спецификации POSIX, и поэтому иногда называется «POSIX Time».Он не считает високосные секунды, а предполагает, что каждый день имел ровно 86 400 секунд.Вы можете прочитать об этом в разделе 20.3.1.1 текущей спецификации ECMAScript , в котором говорится:

Время измеряется в ECMAScript в миллисекундах с 1 января 1970 года по UTC.В значениях времени високосные секунды игнорируются.Предполагается, что это ровно 86 400 000 миллисекунд в день.

JavaScript не уникален в этом отношении.Это то, что делают подавляющее большинство других языков, включая Python, Ruby, .NET, типичную реализацию time_t в C и многие другие.

Поскольку вы изменили свойсистема для отслеживания TAI вместо UTC, и в вашей системе есть реализация таблицы дополнительных секунд, которую понимает команда date, тогда в вашей системе time_t не является меткой времени Unix, а скорее TAIвариант на основе , маскирующийся под метку времени Unix.То, что команда date и другие базовые функции распознают это, не означает, что она распространяется на все платформы и среды выполнения на вашем компьютере.

Дело в том, что непредсказуемая природа високосных секунд делает ихочень сложно работать в API.Обычно нельзя передавать временные метки вокруг тех таблиц, которые требуют правильной интерпретации таблиц високосных секунд, и ожидать, что одна система будет интерпретировать их так же, как и другая.Например, хотя ваша временная метка 1483228826 в вашей системе равна 2017-01-01T00:00:00Z, она будет интерпретироваться как 2017-01-01T00:00:26Z в системах на основе POSIX или в системах без таблиц с високосными секундами.Так что они не портативны.Даже в системах с полностью обновленными таблицами невозможно сказать, что эти таблицы будут содержать в будущем (после 6-месячного периода объявления IERS), поэтому я не могу создать будущую временную метку без риска ее возможного изменения.

Чтобы быть ясным - чтобы поддерживать високосные секунды в языке программирования, реализация должна делать все возможное, чтобы сделать это, и должна делать компромиссы, которые не всегда приемлемы.Хотя есть исключения, общая позиция заключается в том, чтобы не поддерживать их - не из-за каких-либо подрывных действий или активных контрмер, а потому, что поддерживать их должным образом намного, намного сложнее.

Тем не менее, у вас есть надежда, если выдействительно заботятся о високосных секундах в JavaScript.Вы можете добавить свои мысли к TC39 Временное предложение (из которых я один из чемпионов).Это не изменит поведение объекта Date, который выпекается уже десятилетиями.Но мы разрабатываем новый набор стандартных объектов для даты и времени в JavaScript и хотели бы получить ваши отзывы и участие.Существует тема, в которой мы рассматривали различные способы, которыми високосные секунды могут быть частью этого вопроса # 54 .На данный момент мы не слишком задумывались о системах на основе TAI.Если это та область, в которой у вас есть опыт, пожалуйста, добавьте свои мысли туда.Имейте в виду, что нам нужно сбалансировать это с общими потребностями сообщества, но мы хотели бы, чтобы ваши мысли.Спасибо!

...