为什么可以追溯到1600年代?
Windows 不像Unix系统那样存储文件修改时间戳。根据Windows开发中心(重点是我):
文件时间是一个64位值,代表自1601年1月1日世界协调时间(UTC)以来 100纳秒间隔的数量。当应用程序创建,访问和写入文件时,系统记录文件时间。
因此,通过在此处设置错误的值,您可以轻松获取1600年代的日期。
当然,另一个重要的问题是:该值是如何设置的?实际日期是几点?我认为您将永远无法找到答案,因为那可能只是文件系统驱动程序中的一个计算错误。另一个答案假设日期实际上是被解释为Windows时间戳的Unix时间戳,但实际上是根据不同的间隔(秒与纳秒)计算得出的。
这与2038年的问题有什么关系?
使用64位数据类型意味着Windows(通常)不受2038年的影响传统的Unix系统已遇到问题,因为Unix最初使用的是32位整数,其溢出时间比Windows的64位整数要早。拥有。(尽管Unix以秒为单位运行,而Windows以微秒/纳秒运行。)
当然,使用使用旧版本Visual Studio编译的32位程序时,Windows 仍然会受到影响。
较新的Unix操作系统已经将数据类型扩展为64位,从而避免了该问题。(实际上,由于Unix时间戳以秒为单位运行,因此从现在起,新的环绕日期将为2920亿年。)
可以设置的最大日期是多少?
对于好奇的人-这是计算方法:
- 的可能值的一个64位的整数数目是2 63 - 1 = 9223372036854775807。
- 每个刻度表示100纳秒,即0.1 µs或0.0000001 s。
- 最大时间范围将是9223372036854754775807⨉0.0000001 s,因此是数千亿秒。
- 一小时有3600秒,一天有86400秒,一年有365天,因此一年中有86400⨉365 s = 31536000 s。当然,这只是一个平均值,忽略了leap年,leap秒或将来的世界末日政权可能决定其余世人的任何日历变化。
- 9223372036854775807⨉0.0000001 s / 31536000 s≈29247年
@corsiKa
解释了如何减去leap年:29247/365/4≈20
- 因此,您的最高年份为1601 + 29247 – 20 = 30828。
实际上,有些人试图设置该值,并于同年提出。