随着2018年10月10日Win更新,Windows具有闰秒意识。Is.NET';现在也是约会时间吗?
2012年,这里有一个问题,即.NET的DateTime是否能够识别闰秒。[1] 答案是否定的 文件中仍然明确指出,事实并非如此。[2] 然而,Windows Server 2019和Windows 2018年10月10日的更新使Windows本身意识到了闰秒。[3] 这就引出了一个问题:现在.NET天生就知道闰秒了吗?更具体地说:我可以通过某种方式选择加入,让我的随着2018年10月10日Win更新,Windows具有闰秒意识。Is.NET';现在也是约会时间吗?,.net,datetime,time,utc,leap-second,.net,Datetime,Time,Utc,Leap Second,2012年,这里有一个问题,即.NET的DateTime是否能够识别闰秒。[1] 答案是否定的 文件中仍然明确指出,事实并非如此。[2] 然而,Windows Server 2019和Windows 2018年10月10日的更新使Windows本身意识到了闰秒。[3] 这就引出了一个问题:现在.NET天生就知道闰秒了吗?更具体地说:我可以通过某种方式选择加入,让我的DateTime结构也意识到闰秒吗 编辑: 来自题为“任务:在Windows上编写闰秒感知应用程序”的MS Word文档[4](我强
DateTime
结构也意识到闰秒吗
编辑:
来自题为“任务:在Windows上编写闰秒感知应用程序”的MS Word文档[4](我强调):
已知问题:已知某些框架计算时间不正确
闰秒发生后。例如,.NET Framework使用其
拥有内部逻辑以确定时间。其逻辑并非如此
说明闰秒。所以在闰秒被引入到
操作系统“System.DateTime.Now.ToString()”的输出将
领先本地系统时间一秒(我们正在与
.NET framework团队在这方面的支持。)
从[5]开始:
已知某些应用程序通过假设
一分钟内总有60秒。因为闰秒可以
如果更改此行为,他们将不正确地记录此过程中的时间
事件例如(在撰写本文时):
.NET框架使用
它自己的内部逻辑决定了它是什么时间和不是什么时间
说明闰秒。因此,PowerShell依赖于
.NET Framework在使用时不会报告第61秒(数字60)
约会
事件查看器:事件的日期将不正确
记录。但是,事件元数据将正确记录系统
时间(显示第60秒)
注意:这些团队正在努力更新他们的软件以供使用
处理闰秒时更合适的数学方法
因此,在未来的某个时候,.NET似乎会意识到闰秒。因此,我不会将此作为解决方案发布
[1]
[2]
[3]
[4] (Word女士)
[5] (Word女士)
[H] 这里有一些关于.NET(版本4.7.2)如何在
支持闰秒的Windows版本(即Windows 10 RS5
发布):
DateTime(DT)和DateTimeOffset(DTO)的使用方式没有改变
存储时间单位以及如何使用这些单位。这些类型只是
存储滴答声,滴答声为100纳秒。在转换
刻度和日期/时间部分(例如年、月、日、小时、分钟、秒、,
毫秒)它始终假定分钟为60秒,不能
61秒。i、 e.在滴答声或跳跃声中不计算闰秒
转换
在DT和DTO上调用Now属性时,我们将结束
调用Windows API(例如GetSystemTimeAsFileTime)。
GetSystemTimeAsFileTime在此处计算闰秒。所以,.NET
在启用闰秒的系统上运行时是否执行额外步骤
通过调用更多Windows API获取准确时间,该API可以报告
系统时间,以确保.NET报告的时间与
系统。NET仍在调用GetSystemTimeAsFileTime,以便
获得更精确的时间(精确到100纳秒)
万一
Windows向我们报告第二个数字60(闰秒),.NET
将假定这是该分钟的最后一秒,并将其用作
第二步是使其与DT和DTO无缝地工作
不知道闰秒
如果有人试图用
闰秒(60),.NET将首先通过调用Windows API进行检查
是有效的闰秒,然后将其转换为第二个数字59。如果是
无效的闰秒,那么我们将抛出异常
NET没有改变
DT和DTO如何工作以实现应用程序兼容性
知道许多用户在他们的代码中做了相同的假设
总有一分钟是60秒。和不同系统中的滴答声
不能意味着不同的时间。如果你还有任何问题,请告诉我
或者你需要更多的澄清
资料来源:通过提供可能感兴趣的更多细节,扩展了公认的答案 虽然UTC意识到在Windows Server 2019和Windows 2018年10月10日更新之前,.NET的
DateTime
结构偶尔会插入闰秒(且有争议[1]),但Windows本身也不是[2]
但是,即使Windows的内核现在能够识别闰秒,应用程序仍然不能识别闰秒,除非采取具体措施。[5]NET framework本身还不支持闰秒。[6]
但是,Windows系统通过NTP(使用UTC)更新其时间,NTP是闰秒感知的。[7]这可能会导致Windows系统的时间不连续,因为作为NTP客户端工作的Windows时间服务可能希望在下一次同步时立即同步系统时间,在闰秒之后的某个时间,可能导致时钟向后跳1秒。[8]
当然,负时间值的出现可能(在Linux系统上[9][10])导致不受欢迎或不可预测的行为,这就是为什么Windows不会让这种情况发生
调用DateTime.Now
方法时,将调用支持闰秒的Windows API函数GetSystemTimeAsFileTime
。当获得23:59:60 UTC的闰秒时,它被视为23:59:59 UTC的第二次出现,而不重新计算100 ns的滴答声,而是将该秒的所有1000万滴答声保持在可能的最大滴答声计数,即计时实际上会暂停一秒钟。[11]
请注意,在DateTime
结构中输入23:59:60作为时间会导致.Net根据