Python日期时间.时间戳()发行

2024-09-22 14:30:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我发现日期时间.时间戳()函数在Linux和Windows上返回不同的值。下面是一个简单的复制方法:

from datetime import date, time, datetime, timedelta

def main(): 
    dt = datetime(2000, 1, 1)
    edt = datetime(2006, 12, 31)

    fname = 't1.csv'
    f = open(fname, 'w')
    f.write('date,timestamp\n')
    while dt <= edt:
        f.write('{0:%Y-%m-%d},{1:.0f}\n'.format(dt, dt.timestamp()))
        dt += timedelta(days=1)
    f.close()

return 0

这是最后一个与Windows不同的部分:(Windows7 64+Python3.4.3 64)

^{pr2}$

下面是相应的Linux输出:(RedHat6 64+Python 3.4.3 64)

...
2006-10-30,1162184400
2006-10-31,1162270800
2006-11-01,1162357200
2006-11-02,1162443600
2006-11-03,1162530000
2006-11-04,1162616400
2006-11-05,1162702800
...

所有系统都使用EST和自动DST调整。一些观察结果:

  • linux输出似乎是正确的
  • 2006年后未观察到差异(我没有在2015年12月31日以上进行测试)
  • 差别似乎是1小时/3600秒
  • 这种差异似乎只发生在当年DST变更前后(或欧盟/美国有不同的DST变更日期)

只是想知道为什么timestamp()函数在windows和linux上的行为不同。在


Tags: 函数datetimedatelinuxwindows时间dt差异
2条回答

在对您的问题做了一些研究之后,我发现了这个link它讨论了系统的开始日期是如何不同的,我认为linux就像unix,使用01/01/1970作为它的开始时间,而windows使用的时间要早得多,这取决于您正在做什么,从我收集的信息来看,如果您将文件保存到但是用于计算时间戳的时间是31/12/1601。所以看起来他们所看到的开始时间是不同的,如果你再看一看,你会发现实际的开始时间是不同的,比如12:00:00。在

原始日期时间对象上的datetime.timestamp()在内部调用mktime(),即输入被解释为本地时间。本地时间定义可能因系统而异。在

如果本地时区过去有不同的utc偏移量,并且没有使用历史时区数据库,则Cmktime()可能返回错误的结果。python无法在Windows上访问{a1}。在

如果应用程序使用不同的tzdata版本,可能会得到不同的结果。如果使用不同的mktime()实现(其他都相同),那么对于不明确的时间(例如,在DST转换期间),也可能得到不同的结果。在

要在不同的系统上获得相同的结果,use ^{} module(不同系统上的同一版本使用与Python包zoneinfo捆绑在一起):

#!/usr/bin/env python3
from datetime import datetime
import pytz  # $ pip install pytz

tz = pytz.timezone('America/New_York')
for tt in [(2006, 10, 30),
           (2006, 10, 31),
           (2006, 11, 1),
           (2006, 11, 2),
           (2006, 11, 3),
           (2006, 11, 4),
           (2006, 11, 5)]:
    dt = datetime(*tt)
    ts = tz.localize(dt, is_dst=None).timestamp()
    print("{dt:%Y-%m-%d},{ts:.0f}".format(**vars()))

输出(pytz.__version__ == 2014.10

^{pr2}$

相关问题 更多 >