Объект 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.Если это та область, в которой у вас есть опыт, пожалуйста, добавьте свои мысли туда.Имейте в виду, что нам нужно сбалансировать это с общими потребностями сообщества, но мы хотели бы, чтобы ваши мысли.Спасибо!