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

2024-04-20 11:09:57 发布

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

我试图理解时代的本质及其行为。下面我用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中的同一日期应该用7小时来表示utc。有人能解释一下吗?

谢谢


Tags: importdatetimetime时间outputsyearutcday
1条回答
网友
1楼 · 发布于 2024-04-20 11:09:57

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”即“seconds since epoch”并不依赖于时区。现在既不是当地时间也不是世界时。知道时间戳后,您可以相应地使用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时间戳,请参见this answer

相关问题 更多 >