【发布时间】:2019-09-21 15:50:22
【问题描述】:
2012 年,这里有一个关于 SO 的问题,.NET 的 DateTime 是否能够识别闰秒。 [1] 答案是否定的。
文档仍然明确指出它不是。 [2]
但是,Windows Server 2019 和 2018 年 10 月 10 日的 Windows 更新使 Windows 本身意识到了闰秒。 [3]
这引出了一个问题:.NET 现在是否天生具有闰秒意识?更具体地说:我可以通过某种方式选择加入我的DateTime 结构吗?
编辑:
来自题为“任务:在 Windows 上编写闰秒感知应用程序”[4](我强调)的 MS Word 文档:
已知问题:已知某些框架会错误地计算时间 闰秒发生后。例如,.NET Framework 使用它的 自己的内部逻辑来确定现在是什么时候。它的逻辑不 考虑闰秒。所以在闰秒被引入到 操作系统“System.DateTime.Now.ToString()”的输出将 比本地系统时间提前一秒。 (我们正在与 .NET 框架团队。)
从[5]:
已知某些应用程序会通过假设错误地计算时间 一分钟总有60秒。由于闰秒可以 改变这种行为,他们将不正确地记录在此期间的时间 事件。例如(在撰写本文时):
.NET 框架使用 它自己的内部逻辑来确定现在是什么时间,什么时候不是 考虑闰秒。因此,依赖于 .NET Framework,使用时不会报告第 61 秒(数字 60) 获取日期
事件查看器:事件的日期将不正确 记录下来。但是,事件元数据将正确记录系统 时间(显示第 60 秒)。
注意:这些团队正在努力更新他们的软件以供使用 处理闰秒时更合适的数学运算。
因此,.NET 似乎在未来的某个时间会意识到闰秒。因此,我不会将此作为解决方案发布。
[1]Are .Net's DateTime methods capable of recognising a Leap Second?
[3]https://support.microsoft.com/en-us/help/2722715/support-for-the-leap-second
[4]https://aka.ms/Dev-LeapSecond(MS Word)
[5]https://aka.ms/ITPro-LeapSecond(MS Word)
【问题讨论】:
-
分页@JonSkeet...
-
“闰秒感知”到底是什么意思?您仍然无法用 60 秒初始化 DateTime 结构:ideone.com/mrublk, docs.microsoft.com/en-us/dotnet/api/…
-
除了大量的注册表黑客来打开它之外,应用程序还需要调用 GetSystemTime() 或 GetLocalTime() winapi 函数来观察 60 秒的值。将系统时钟破解为 hh/mm/ss 的唯一功能。 CLR 和框架都不使用这些功能,您必须使用 pinvoke。
-
@HansPassant,看起来是这样,但显然,幕后发生了一些事情,请参阅我的编辑。
-
@Herb Jon Skeet 对日期和时间了解一两件事,将 Joda Time 移植到 Noda Time。见codeblog.jonskeet.uk/category/nodatime。
标签: .net datetime time utc leap-second