在python中是time.mktime时区免费的



我正在努力理解epoch的本质及其行为。下面我用2个不同时区的特定日期时间和1个初始日期时间尝试了相同的日期

import time
import pytz
from datetime import datetime, timedelta
pst = pytz.timezone('America/Los_Angeles')
t = datetime(year=2015, month=2, day=2)
t = pst.localize(t)
time.mktime(t.timetuple()) 
# outputs 1422864000.0

utc = pytz.utc
k = datetime(year=2015, month=2, day=2)
k = utc.localize(k)
time.mktime(k.timetuple())
# outputs 1422864000.0


o = datetime(year=2015, month=2, day=2)
time.mktime(o.timetuple())
# outputs 1422864000.0

它们都有相同的历元,但这令人惊讶,因为pst中的相同日期应该相对于utc偏移7小时。有人能解释一下吗?

感谢

time.mktime()返回相同的结果,因为它在所有三种情况下都接收到几乎(~isdst)相同的输入:

time.struct_time(tm_year=2015, tm_mon=2, tm_mday=2, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=0, tm_yday=33, ..)

.timetuple()不存储utc偏移。它相当于天真的datetime对象。

一般来说,"epoch",即"自epoch以来的秒数"不取决于时区。既不是当地时间也不是utc。知道了时间戳,就可以相应地使用datetime.fromtimestampdatetime.utcfromtimestamp来获得时间戳。

如果您的本地时区与'America/Los_Angeles'不同(utc偏移量不同),则所有三个时间实例都不同,因此所有三个POSIX时间戳都不同:

#!/usr/bin/env python3
from datetime import datetime
import pytz # $ pip install pytz
pacific = pytz.timezone('America/Los_Angeles')
naive  = datetime(2015, 2, 2)
pacific_dt = pacific.localize(naive, is_dst=None)
print(pacific_dt.timestamp())
utc_dt = naive.replace(tzinfo=pytz.utc)
print(utc_dt.timestamp())
print(naive.timestamp()) #NOTE: interpret as local time

最后一次调用可能在内部使用mktime(naive.timetuple())

输出

1422864000.0
1422835200.0
1422831600.0

注意:所有三个时间戳都不同。

要在较旧的Python版本上获得POSIX时间戳,请参阅以下答案。

相关内容

  • 没有找到相关文章

最新更新