是否在Windows FILETIME结构包括闰秒?(Does the windows FILETI

2019-07-02 13:26发布

FILETIME结构自1601年1月1(当天的大概开始)计数根据微软的文档,但是这并不包括闰秒?

Answer 1:

这个问题不应该是如果FILETIME包括闰秒。

它应该是:

办人民,功能和库,谁解释一个FILETIME (即FileTimeToSystemTime )包括闰秒计算的持续时间是什么时候?

简单的答案是“不”。 FileTimeToSystemTime返回秒为0..59


简单的答案是:“ 当然不是,怎么可能呢?”。

我的Windows 2000机器不知道有在十年间增加2闰秒,因为它被释放。 它使任何解释FILETIME是错误的。


最后,而不是依赖于逻辑,我们可以通过直接实验观察判断,答案海报的问题:

var
    systemTime: TSystemTime;
    fileTime: TFileTime;
begin
    //Construct a system-time for the 12/31/2008 11:59:59 pm
    ZeroMemory(@systemTime, SizeOf(systemTime));
    systemtime.wYear := 2008;
    systemTime.wMonth := 12;
    systemTime.wDay := 31;
    systemTime.wHour := 23;
    systemtime.wMinute := 59;
    systemtime.wSecond := 59;

    //Convert it to a file time
    SystemTimeToFileTime(systemTime, {var}fileTime);

    //There was a leap second 12/31/2008 11:59:60 pm
    //Add one second to our filetime to reach the leap second
    filetime.dwLowDateTime := fileTime.dwLowDateTime+10000000; //10,000,000 * 100ns = 1s

    //Convert the filetime, sitting on a leap second, to a displayable system time
    FileTimeToSystemTime(fileTime, {var}systemTime);

    //And now print the system time
    ShowMessage(DateTimeToStr(SystemTimeToDateTime(systemTime)));

增加一秒

12/31/2008 11:59:59pm

1/1/2009 12:00:00am

而不是

1/1/2009 11:59:60pm

QED

楼主可能不喜欢它,但上帝故意操纵它,因此今年是不是由天整除。 他之所以这样做是搞砸了程序员。



Answer 2:

这里的关于为什么选择特定的日期一些更多的信息。

自1月1日FILETIME结构记录在100纳秒的时间间隔的形式时,1601为什么那个日期选择?

公历400年周期,因此1601是活跃在当时是被设计用于在Windows NT中周期的第一年。 换句话说,它被选为使数学出来很好。

其实,我从戴夫·卡特勒确认此电子邮件。



Answer 3:

不能有任何单一的答案,这个问题不首先决定:什么是Windows FILETIME实际计数? 微软的文档说计数自1601 UTC 100周纳秒的时间间隔,但是这是有问题的。

国际协调时间没有形式存在的前一年1960名UTC本身并没有在任何文献中之前,1964年发生的名称UTC作为官方指定不存在,直到1970年。但是,事情变得更糟糕。 未建立格林威治天文台,直到1676,因此,即使试图解释FILETIME为GMT没有明确的意义,它是大约只有然后用准确的擒纵是摆钟开始给予1秒的精度。

如果FILETIME被解释为平均太阳秒,然后自1601的闰秒的数量是零,对于UT没有闰秒。 如果FILETIME被解释为,如果出现了原子天文钟,然后自1601闰秒的数目大约为-60(这是60负闰秒)。

这是古老的历史,怎么样,因为原子时计的时代? 这是再好不过的,因为各国政府没有作出平均太阳秒和SI秒之间的区别。 十年来的ITU-R一直在讨论放弃闰秒,但他们都没有取得国际共识。 对于这部分原因可以在可以看到这个页面的JavaScript (也看到了古老历史的地块在该网页上增量T链接)。 由于各国政府还没有做出明确的区分,任何试图定义自1972年以来的秒计数的运行根据某些司法管辖区的法律是无效的风险。 到ITU-R的代表们都知道这个复杂的,因为是在POSIX委员会的乡亲。 直到外交问题得到解决,直到各国政府和国际标准,使平均太阳和SI秒之间有着明显的区别和选择,有一点希望计算机标准可以仿效。



Answer 4:

闰秒由IERS不可预测地增加。 自1972年以来,当被定义UTC和闰秒23秒已被添加。 维基说“因为地球自转速率的长期不可预测的,这是无法预测需要提前它们半年以上。”

因为你必须保持在闰秒被插入的历史,并不断更新操作系统,以保持当他们被插入的参考,差异是如此之小,它的公平,不要指望通用操作系统补偿闰秒。

此外,定期时钟漂移,相对于UTC在个人电脑中简单的电子时钟,那么比闰秒所需的补偿大得多。 如果你需要的那种精度补偿闰秒,你不应该使用高度不准确的PC时钟。



Answer 5:

这个问题的答案以前是没有这个问题,但已更改为:YES,排序的,有时 ...

每Windows网络团队博客文章 :

在服务器2019年的窗10年10月开始[2018]更新时间的API现在会考虑所有闰秒的操作系统知道,当它转化FILETIME到SYSTEMTIME的。

由于已经有发行由于要添加这个功能的时候没有闰秒,操作系统仍然不知道任何闰秒。 然而,当下一个官方闰秒做它的方式融入世界,启用了这一新功能的Windows电脑将跟踪它,从而FILETIME值将由闰秒的数量在他们的时间在计算机上被抵消解释。

博客文章继续描述:

没有变更FILETIME制成。 它仍然是从纪元开始的100个纳秒间隔数。 有所改变的是这个数字的解释,当它被转换为SYSTEMTIME和背部。 下面是受影响的API列表:

  • GetSystemTime
  • GetLocalTime
  • FileTimeToSystemTime
  • FileTimeToLocalTime
  • SystemTimeToFileTime
  • SetSystemTime
  • SetLocalTime

在此之前的版本,SYSTEMTIME有有效值wSecond 0之间,现在59 SYSTEMTIME已经更新到允许值60,提供的年,月,日表示日期,其中一个闰秒是有效的。

...

为了接收在SYSTEMTIME结构60秒的处理,必须明确地选择加入英寸

需要注意的是选择在适用上如何列出的职能范围内的行为FILETIME映射到SYSTEMTIME 。 不管你是否选择加入与否,操作系统仍然会抵消FILETIME根据闰秒是知道的值。

至于兼容性,文章指出:

依赖于第三方框架应确保其架构的Windows上实现的应用程序也被调用到正确的API来计算正确的时间,否则该应用程序将有错误的时间报道。

并且还提供了一个链接到先前的帖子介绍如何禁用整个功能,如下所示:

...您可以通过添加以下注册表项恢复到先前的操作系统行为和禁止闰秒全线:

  • HKLM:\SYSTEM\CurrentControlSet\Control\LeapSecondInformation
  • 类型: “REG_DWORD”
  • 名称:启用
  • 值: 0禁用系统范围的设置
  • 值: 1使系统范围的设置

接下来,重新启动系统。



Answer 6:

一个非常粗略的总结:

UTC =(原子时间)+(闰秒)~~(平均太阳时)

在MS文档中说,具体而言,“UTC”,所以应包括闰秒。 与往常一样与MS,您的里程可能会有所不同。



Answer 7:

根据这一意见的窗口是完全不知道的闰秒。 如果添加24 * 60 * 60秒,表示今天1时39分45秒一个FILETIME,你会得到一个代表1时39分45秒的明天,不管什么FILETIME。



文章来源: Does the windows FILETIME structure include leap seconds?