Расширение принятого ответа путем предоставления более подробной информации, возможно, представляющей интерес.
Хотя UTC знает о случайном (и оспариваемом [1]) введении високосной секунды, структура DateTime
.NET до Windows Server 2019 и обновления Windows 10 за октябрь 2018 - нет, [2] потому что сама Windows не был ни. [3] [4]
Но даже несмотря на то, что ядро Window теперь знает о високосных секундах, приложения все равно не узнают, если не предпринимаются конкретные действия. [5] Платформа .NET сама по себе еще не поддерживает високосные секунды. [6]
Тем не менее, системы Windows обновляют свое время через NTP (используя UTC), что позволяет учитывать дополнительные секунды. [7] Это может привести к разрывам во времени в системах Windows, поскольку служба времени Windows, работающая в качестве NTP-клиента, может захотеть синхронизировать время системы сразу после следующей синхронизации через некоторое время после високосной секунды, что может привести к тому, что часы переместятся назад на 1 секунду. [8]
Конечно, возникновение отрицательного значения времени может (и в системах Linux [9] [10]) привело к нежелательному или непредсказуемому поведению, поэтому Windows не допустит этого.
При вызове методов DateTime.Now
вызывается функция Windows 101 с поддержкой високосной функции GetSystemTimeAsFileTime
. При получении високосной секунды 23:59:60 UTC она обрабатывается как второе вхождение в 23:59:59 UTC без повторного подсчета тиков 100 нс, но с сохранением всех 10 миллионов тиков этой секунды при максимально возможном количестве тиков. вместо этого, т. е. хронометраж фактически останавливается на секунду. [11]
Обратите внимание, что ввод 23:59:60 как времени в структуре DateTime
приводит к тому, что .Net выполняет проверки в соответствии с уже имеющимися високосными секундами. Если это действительно так, оно будет принято (но преобразовано в 23:59:59). [11]
[1] Международная служба вращения Земли и системы отсчета (IERS); Всемирное координированное время (UTC) для сохранения «високосной секунды» - https://www.iers.org/SharedDocs/Publikationen/EN/IERS/Publications/messages/IERS_Message_No_282.html
[2] Microsoft; Свойство DateTime.Ticks - https://docs.microsoft.com/en-us/dotnet/api/system.datetime.ticks?redirectedfrom=MSDN&view=netframework-4.8#System_DateTime_Ticks
[3] Microsoft; Как служба Windows Time относится к високосной секунде - https://support.microsoft.com/en-us/help/909614/how-the-windows-time-service-treats-a-leap-second
[4] Microsoft; Поддержка високосной секунды - https://support.microsoft.com/en-us/help/2722715/support-for-the-leap-second
[5] Microsoft; Вторичная проверка для разработчиков - https://aka.ms/Dev-LeapSecond
[6] Microsoft; Вторичная проверка для ИТ-специалистов - https://aka.ms/ITPro-LeapSecond
[7] Д. Миллс (Университет штата Делавэр); Обработка второго прыжка - https://www.eecis.udel.edu/~mills/ntp/html/leap.html
[8] Microsoft; Как служба Windows Time относится к високосной секунде - https://support.microsoft.com/en-us/help/909614/how-the-windows-time-service-treats-a-leap-second
[9] Проводной; Ошибка «Прыжок второй» привела к хаосу в сети - https://www.wired.com/2012/07/leap-second-bug-wreaks-havoc-with-java-linux/
[10] /root.in; Ошибка второго прыжка в ядре Linux - https://www.slashroot.in/leap-second-bug-linux-kernel
[11] Github; Второе утверждение сбивает с толку - https://github.com/dotnet/dotnet-api-docs/issues/966#issuecomment-434440807