1

当我跑线时

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 在我输入的日期是否有效。

4

2 回答 2

3

首先,不要包含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
于 2012-11-19T13:26:34.243 回答
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模块),因此:

  • 它适用于过去的日期,因为与 DST 无关的原因,UTC 偏移量可能有所不同。
  • 当 DST 无法确定时,它会检测不明确或不存在的本地时间
  • 它适用于 Windows 和 *nix (tzlocal模块)

注意:mktime()@Random832'a 中显示的基于解决方案的答案

import time

isdst = time.localtime(time.mktime(naive_dt.timetuple())).tm_isdst > 0
  • 如果操作系统不提供自己的历史时区数据库,它可能会默默地为过去的某个日期提供错误的结果
  • 对于不明确或不存在的当地时间(在 DST 转换期间),它可能会默默地提供错误的结果
于 2014-04-17T17:01:01.720 回答