当我跑线时
time.strptime("2012-06-01 12:00:00 "+time.strftime("%Z"), "%Y-%m-%d %H:%M:%S %Z")
它为我创建了一个结构,但标志tm_isdst
是错误的。在 6 月初 DST 处于活动状态,但无论我在什么日期输入tm_isdst
标志始终设置为localtime()
现在的状态。我需要知道 DST 在我输入的日期是否有效。
首先,不要包含time.strftime('%Z')
在您的格式中。您正在告诉它您当前的 GMT 偏移量(包括关闭夏令时),并且它 [可能] 使用它来设置 tm_isdst。
没有它,你应该得到一个结构tm_isdst=-1
:
>>> time1 = time.strptime("2012-06-01 12:00:00", "%Y-%m-%d %H:%M:%S")
>>> time1
time.struct_time(tm_year=2012, tm_mon=6, tm_mday=1, tm_hour=12, tm_min=0,
tm_sec=0, tm_wday=4, tm_yday=153, tm_isdst=-1)
现在,您可以将它传递给 mktime,它会在给定-1
值的情况下“猜测”DST 值(我将“猜测”放在引号中,因为它总是正确的,除了凌晨 2 点不明确的情况)。这将以time()
格式给出绝对时间。
>>> time.mktime([previous value]) # my timezone is US Eastern
1338566400.0
然后你可以用这个值调用本地时间,它会有一个正确设置的 DST 标志:
>>> time.localtime(1338566400).tm_isdst
1
您也可以跳过 strptime 步骤,直接将值传递给 mktime:
>>> time.mktime((2012,6,1,12,0,0,-1,-1,-1))
1338566400.0
您的问题相当于如何将作为字符串给出的本地时间转换为附有本地时区信息的本地时间:
from datetime import datetime
from pytz.exceptions import InvalidTimeError # $ pip install pytz
from tzlocal import get_localzone # $ pip install tzlocal
naive_dt = datetime.strptime("2012-06-01 12:00:00", "%Y-%m-%d %H:%M:%S")
local_tz = get_localzone()
try:
local_dt = local_tz.localize(naive_dt, is_dst=None)
except InvalidTimeError as e:
print("can't determine whether DST is active, reason: %s" % (e,))
else:
assert local_dt.dst() is not None
print("DST is %sactive" % ("" if local_dt.dst() else "not ",))
它使用Olson tz 数据库(pytz
模块),因此:
tzlocal
模块)注意:mktime()
@Random832'a 中显示的基于解决方案的答案:
import time
isdst = time.localtime(time.mktime(naive_dt.timetuple())).tm_isdst > 0