292,277,026,596的日期是如何计算出64位签名的UNIX时间戳的溢出日期



我试图使用最大64位签名的整数来计算自己的日期,但总是以另一个日期不同了几百万年。我已经尝试使用恒星年份和leap年,但是我总是得到至少有几百万年的结果。

这是我迄今为止尝试的:

dateA = 1970 + (9223372036854775807/31556926.08)

dateB = 1970 + (9223372036854775807/31536000) + (((9223372036854775807/31536000)/4)/365)

都返回错误的答案。谁能指导我朝正确的方向引导?

您需要考虑leap年的年份。如果:

  • 它均匀地被4;
  • 分开
  • 除非 均由100;
  • 均匀排除
  • 如果均匀排除400。

作为一年的粗略估计,计算1970 + 0x7fffffffffffffff // 86400 // (365 + 1/4 - 1/100 + 1/400)给出了292277026596的答案。我将离开确切的一天的派生作为读者的练习。

我使用Python 3进行了此计算,从而为整数划分提供了实际结果。相应地针对Python 2。

让我们使用datetime进行一些繁重的举重。

>>> import datetime

首先,格里高利日历每400年重复一次。这是400年周期中的天数:

>>> 365 * 400 + 100 - 4 + 1
146097

清除?每年至少有365天。将有100年的LEAP年( 100),除了100个不是Leap年的年度(-4),除了400年的年度( 1)。

然后使用它来弄清楚多少400年的块在许多秒数中拟合,等于最大的63位整数:

>>> divmod((1 << 63) - 1, 146097 * 24 * 3600)
(730692561, 7161147007)

因此,我们有730692561 400年的区块,还剩7161147007秒。datetime可以直接计算以上的秒数:

>>> datetime.datetime(1970, 1, 1) + datetime.timedelta(seconds=7161147007)
datetime.datetime(2196, 12, 4, 15, 30, 7)

所以,除了这一年,最后一个可代表的第二个是12月4日15:30:07 UTC。

要获得这一年,只需添加730692561 400年块:

>>> 2196 + 730692561 * 400
292277026596

最新更新