检查日期是否为夏令时没有pytz

时间:2016-08-02 14:08:41

标签: python python-3.x datetime

出于某些原因,我的雇主不想使用pip来安装第三方软件包,并希望我使用仅托管在可信任软件包上的软件包。因此,我现在不能在我的代码中使用pytz。我如何检查时区中的某个日期是否在夏令时?这是我使用pytz的原始代码。

    import pytz
    import datetime
    ...

    target_date = datetime.datetime.strptime(arg_date, "%Y-%m-%d")
    time_zone = pytz.timezone('US/Eastern')
    dst_date = time_zone.localize(target_date, is_dst=None)
    est_hour = 24
    if bool(dst_date.dst()) is True:
        est_hour -= 4
    else:
        est_hour -= 5

2 个答案:

答案 0 :(得分:1)

在一般情况下,这是一个复杂的问题,不适合手卷解决方案。依靠由专职人员(例如pytz)审查和维护的外部模块是唯一合理的选择。

然而,考虑到您只对美国时区感兴趣,特别是东方,可以编写一个简单的功能。这显然只对当前(2016)规则有利,last changed in 2007并且可能随时再次更改。这些规则规定了DST starts on the second Sunday in March and ends on the first Sunday in November

此代码基于my algorithm for finding a particular day of a month

def is_dst(dt):
    if dt.year < 2007:
        raise ValueError()
    dst_start = datetime.datetime(dt.year, 3, 8, 2, 0)
    dst_start += datetime.timedelta(6 - dst_start.weekday())
    dst_end = datetime.datetime(dt.year, 11, 1, 2, 0)
    dst_end += datetime.timedelta(6 - dst_end.weekday())
    return dst_start <= dt < dst_end

答案 1 :(得分:0)

不使用pip安装pytz

DST是任意的,并且在不同地区通过立法选择,你无法真正计算它 - 看看the pytz source for US/Eastern, for example,它实际上是DST在接下来的20年中发生变化的硬编码日期列表。

你可以自己做,从pytz做的同一来源(ZoneInfo / [或此链接](http://www.iana.org/time-zones))中提取数据。或者从你的操作系统实现tz,如果有一个......

但(除非是许可原因)让您的雇主查看pytz来源并确认它是可接受的无害并批准使用。