在2012年,这里有一个问题,.NET的DateTime是否能够识别闰秒。1答案是否定的。
文档仍然明确声明它不是。2
然而,Windows 2019和Windows 10 2018年10月10日的更新使Windows本身意识到了闰秒。3.
这就引出了一个问题:.NET现在是否天生意识到了闰秒?更具体地说:我可以通过选择加入来使我的DateTime
结构也意识到闰秒吗?
编辑:
来自一个名为"Quest:在Windows上编写一个跃秒感知应用程序“的MS Word文档,4
已知的问题:已知的一些框架在闰秒发生后不正确地计算时间。例如,.NET框架使用自己的内部逻辑来确定时间。它的逻辑不考虑闰秒。因此,在将闰秒引入操作系统后,“System.DateTime.Now.ToString()”的输出将领先于本地系统时间的1秒。(我们正在与.NET框架团队合作。)
和从5
有些应用程序通过假设总是有60秒的时间而不正确地计算时间。由于闰秒可以改变此行为,因此它们将在此事件期间不适当地记录时间。例如(在编写本报告时): .NET框架使用它自己的内部逻辑来确定它是什么时间,而不考虑闰秒。因此,依赖于PowerShell框架的.NET将不会在使用Get-Date时报告61秒钟(编号60)。 事件查看器:事件的日期将被错误地记录下来。然而,事件元数据将正确地记录系统时间(显示60秒)。 注意:这些团队正在努力更新他们的软件,以便在处理闰秒时使用更合适的数学方法。
因此,在未来的某个时候,.NET似乎将是第二次意识到。因此,我不会将此作为解决办法。
4 (MS Word)
5 (MS Word)
发布于 2019-05-03 23:50:48
这里说明了.NET (4.7.2版)如何在支持闰秒(即Windows10 RS5发布版)的版本上工作: DateTime (DT)和DateTimeOffset (DTO)在存储时间单位和在这些单元上的操作方式上没有改变。这些类型只存储滴答,滴答是100纳秒。在滴答和日期/时间部分(例如,年、月、日、小时、分钟、秒、毫秒)之间进行转换时,它总是假定分钟是60秒,不能是61秒。也就是说,没有计算在滴答或转换中的闰秒。 当在DT和DTO上调用Now属性时,我们将最终调用Windows (例如GetSystemTimeAsFileTime)。GetSystemTimeAsFileTime在那里计算了闰秒。因此,当在启用了闰秒的系统上运行时,.NET正在执行额外的步骤,通过调用更多的Windows来获得准确的时间,该API可以报告系统时间,以确保.NET报告的时间与系统同步。.NET仍然为了获得更精确的时间(即100纳秒的精度)而调用GetSystemTimeAsFileTime。 如果Windows向我们报告了第二个数字60 (这是一个闰秒),.NET将假设这是该分钟中的最后一秒钟,并将其作为第59秒使用,使其与DT和DTO无缝工作,因为这些类型不知道闰秒。 如果有人试图用闰秒(60)创建DT或DTO,.NET将首先通过调用Windows来检查这是否是有效的闰秒,然后将其转换为第二个数字59。如果它不是有效的闰秒,那么我们将抛出异常。 .NET并没有为了应用程序的兼容性而改变DT和DTO的工作方式,因为我们知道许多用户在代码中做同样的假设,滴答总是有60秒的时间。不同的系统中的蜱不能意味着不同的时间。如果你还有什么问题或需要进一步澄清,请告诉我。
来源:https://github.com/dotnet/dotnet-api-docs/issues/966#issuecomment-434440807
发布于 2019-05-05 15:33:23
通过提供一些可能令人感兴趣的更多细节来扩展已被接受的答案。
虽然UTC知道偶尔(和有争议的1)插入一个闰秒,但在Windows 2019和2018年10月10日更新之前,.NET的DateTime
结构却不是,2因为Windows本身没有。
但是,即使窗口的内核现在已经知道了闰秒,应用程序仍然不支持,除非采取特定的操作。5 .NET框架本身还不支持闰秒。
但是,Windows系统通过NTP (使用UTC)更新时间,这是闰秒7,这可能会导致Windows系统的时间中断,因为作为NTP客户端工作的Windows时间服务可能希望在下一次同步时立即同步系统的时间,这可能会导致时钟向后跳1秒。
当然,负时间值的出现可能(在Linux系统上)会导致不良或不可预测的行为,这就是为什么Windows不会让这种情况发生的原因。
调用DateTime.Now
方法时,将调用闰秒感知的Windows函数GetSystemTimeAsFileTime
。当获得闰秒23:59:60时,它被视为23:59:59世界协调时的第二次出现,而不需要重新计算100 ns的滴答数,而是将该秒的所有1千万刻度保持在可能的最大滴答数上,即计时有效地暂停一秒钟。
注意,在DateTime
结构中输入23:59:60会导致.Net按照迄今发生的闰秒执行检查。如果它确实是一个,它将被接受(但转换为23:59:59).11
1国际地球自转和参考系统服务;协调世界时(UTC)以保持“闰秒”- 282.html
2微软;DateTime.Ticks属性- Ticks
3微软;Windows服务如何对待闰秒- 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微软;第二次验证IT Pros - https://aka.ms/ITPro-LeapSecond
7 D. Mills (特拉华大学);Leap Second Processing - https://www.eecis.udel.edu/~mills/ntp/html/leap.html
8微软;Windows服务如何对待闰秒- https://support.microsoft.com/en-us/help/909614/how-the-windows-time-service-treats-a-leap-second
9线;‘飞跃第二’虫Wreaks破坏跨网络- https://www.wired.com/2012/07/leap-second-bug-wreaks-havoc-with-java-linux/
10 /root.in;linux内核中的第二个bug - https://www.slashroot.in/leap-second-bug-linux-kernel
第二句话令人困惑-- https://github.com/dotnet/dotnet-api-docs/issues/966#issuecomment-434440807
https://stackoverflow.com/questions/55964042
复制相似问题