为了账号安全,请及时绑定邮箱和手机立即绑定

难以理解时间转换

难以理解时间转换

红颜莎娜 2021-08-17 18:15:15
我在理解 python 中的时间转换时遇到了一些麻烦。我有两个相同的time_struct对象In [22]: local_dtOut[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.tznameOut[45]: ('CET', 'CEST')关于时间模块的文档说:使用以下函数在时间表示之间进行转换: struct_time 本地时间自纪元以来的秒数 mktime()据我所知,我的当地时间是“美国/洛杉矶”,所以自纪元以来的秒数应该完全相同,而不取决于系统配置。我有什么误解?那么我该如何正确计算时间戳呢?
查看完整描述

2 回答

?
哈士奇WWW

TA贡献1799条经验 获得超6个赞

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'))

>>> est

datetime.datetime(1999, 12, 31, 19, 0, tzinfo=<StaticTzInfo 'EST'>)

>>> utc

datetime.datetime(2000, 1, 1, 0, 0, tzinfo=<UTC>)

>>> est.timestamp()

946684800.0           

>>> utc.timestamp()

946684800.0           # same as est

>>> time.mktime(est.timetuple())

946684800.0

>>> time.mktime(utc.timetuple())

946702800.0           # different than est

自未传递时区信息以来,最后一次作为本地时间time.mktime()处理utc.timetuple()。您会注意到它偏移了 18000(time.timezone对于 EST,我的时区)。


查看完整回答
反对 回复 2021-08-17
  • 2 回答
  • 0 关注
  • 113 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信