随着2018年10月10日Win更新,Windows具有闰秒意识。Is.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](我强

2012年,这里有一个问题,即.NET的DateTime是否能够识别闰秒。[1] 答案是否定的

文件中仍然明确指出,事实并非如此。[2]

然而,Windows Server 2019和Windows 2018年10月10日的更新使Windows本身意识到了闰秒。[3]

这就引出了一个问题:现在.NET天生就知道闰秒了吗?更具体地说:我可以通过某种方式选择加入,让我的
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根据