猿问

难以理解时间转换

我在理解 python 中的时间转换时遇到了一些麻烦。我有两个相同的time_struct对象


In [22]: local_dt

Out[22]: datetime.datetime(2000, 1, 1, 0, 0, tzinfo=<DstTzInfo 'America/Los_Angeles' PST-1 day, 16:00:00 STD>)

In [23]: local_dt.timetuple()                                                                                                                             

Out[24]: time.struct_time(tm_year=2000, tm_mon=1, tm_mday=1, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=5, tm_yday=1, tm_isdst=0)

当我将它提供给time.mktime一台机器上的功能时


time.mktime(local_dt.timetuple())

它返回 946681200.0


在第二台机器上,我得到了不同的答案


In [31]: local_dt.timetuple()                                                                                                                             

Out[31]: time.struct_time(tm_year=2000, tm_mon=1, tm_mday=1, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=5, tm_yday=1, tm_isdst=0)


In [32]: time.mktime(local_dt.timetuple())                                                                                                                

Out[32]: 946684800.0

不过,这些机器有不同的时区:


In [44]: time.tzname                                                                                                                                      

Out[44]: ('Europe', 'Europe')


In [45]: time.tzname

Out[45]: ('CET', 'CEST')

关于时间模块的文档说:


使用以下函数在时间表示之间进行转换: struct_time 本地时间自纪元以来的秒数 mktime()


据我所知,我的当地时间是“美国/洛杉矶”,所以自纪元以来的秒数应该完全相同,而不取决于系统配置。


我有什么误解?那么我该如何正确计算时间戳呢?


红颜莎娜
浏览 114回答 2
2回答

哈士奇WWW

time.mktime()解释timetuple基于本地计算机的时区。请注意您的timetuple对象如何不包含任何时区信息,因此创建的时间戳将始终根据本地计算机上设置的时区而变化。因此完全可以理解为什么time.mktime(local_dt.timetuple())在这两台机器上相同的返回不同的值。您可以local_dt.timestamp()改用,而两者本质上是相同的...datetime假设Naive实例表示本地时间,并且此方法依赖于平台 Cmktime()函数来执行转换。...但是由于您是timestamp直接从非原始datetime对象创建的,它仍然保留时区信息并可以相应地改变时间:对于感知datetime实例,返回值计算如下:(dt - datetime(1970, 1, 1, tzinfo=timezone.utc)).total_seconds()观察:>>> est = datetime.datetime(1999, 12, 31, 19, 0).astimezone(pytz.timezone('EST'))>>> utc = est.astimezone(pytz.timezone('UTC'))>>> estdatetime.datetime(1999, 12, 31, 19, 0, tzinfo=<StaticTzInfo 'EST'>)>>> utcdatetime.datetime(2000, 1, 1, 0, 0, tzinfo=<UTC>)>>> est.timestamp()946684800.0&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;>>> utc.timestamp()946684800.0&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;# same as est>>> time.mktime(est.timetuple())946684800.0>>> time.mktime(utc.timetuple())946702800.0&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;# different than est自未传递时区信息以来,最后一次作为本地时间time.mktime()处理utc.timetuple()。您会注意到它偏移了 18000(time.timezone对于 EST,我的时区)。
随时随地看视频慕课网APP

相关分类

Python
我要回答