我试图使用最大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