我正在努力理解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.fromtimestamp
和datetime.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时间戳,请参阅以下答案。