44

如何在我的时区中正确表示不同的时区?下面的示例仅适用,因为我知道 EDT 比我早一小时,所以我可以取消注释 myTimeZone() 的减法

import datetime, re
from datetime import tzinfo

class myTimeZone(tzinfo):
    """docstring for myTimeZone"""
    def utfoffset(self, dt):
        return timedelta(hours=1)

def myDateHandler(aDateString):
    """u'Sat,  6 Sep 2008 21:16:33 EDT'"""
    _my_date_pattern = re.compile(r'\w+\,\s+(\d+)\s+(\w+)\s+(\d+)\s+(\d+)\:(\d+)\:(\d+)')
    day, month, year, hour, minute, second = _my_date_pattern.search(aDateString).groups()
    month = [
            'JAN', 'FEB', 'MAR', 
            'APR', 'MAY', 'JUN', 
            'JUL', 'AUG', 'SEP', 
            'OCT', 'NOV', 'DEC'
    ].index(month.upper()) + 1
    dt = datetime.datetime(
        int(year), int(month), int(day), 
        int(hour), int(minute), int(second)
    )                   
    # dt = dt - datetime.timedelta(hours=1)
    # dt = dt - dt.tzinfo.utfoffset(myTimeZone())
    return (dt.year, dt.month, dt.day, dt.hour, dt.minute, dt.second, 0, 0, 0)

def main():
    print myDateHandler("Sat,  6 Sep 2008 21:16:33 EDT")

if __name__ == '__main__':
    main()
4

4 回答 4

39

我建议在使用babelpytz区时。保持您的内部日期时间对象天真并使用 UTC 并转换为您的时区以进行格式化。您可能想要简单对象(没有时区信息的对象)的原因是许多库和数据库适配器不知道时区。

于 2008-09-22T20:59:40.807 回答
11

Python 标准库不包含时区信息,因为不幸的是时区数据的变化比 Python 快得多。为此,您需要一个第三方模块;通常的选择是pytz

于 2008-09-22T20:46:08.593 回答
7

对于当前本地时区,您可以使用:

>>> import time
>>> offset = time.timezone if (time.localtime().tm_isdst == 0) else time.altzone
>>> offset / 60 / 60 * -1
-9

返回的值以 UTC 以西的秒数为单位(UTC 以东的区域为负值)。这与我们实际想要的相反,因此* -1.

localtime().tm_isdst如果夏令时当前无效,则为零(尽管如果一个地区最近更改了夏令时法,这可能不正确)。

于 2009-12-12T13:35:12.613 回答
1

蟒蛇> = 3.9

Python 带有zoneinfo作为标准库的一部分。示例用法:

from datetime import datetime, timezone
from zoneinfo import ZoneInfo
UTC = datetime(2012,11,10,9,0,0, tzinfo=timezone.utc)

# convert to another tz with "astimezone":
eastern = UTC.astimezone(ZoneInfo("US/Eastern"))

# note that it is safe to use "replace",
# to get the same wall time in a different tz:
pacific = eastern.replace(tzinfo=ZoneInfo("US/Pacific"))

print(UTC.isoformat())
print(eastern.isoformat())
print(pacific.isoformat())

# 2012-11-10T09:00:00+00:00
# 2012-11-10T04:00:00-05:00
# 2012-11-10T04:00:00-08:00

另请注意文档中的此部分

zoneinfo 模块不直接提供时区数据,而是从系统时区数据库或第一方 PyPI 包tzdata(如果可用)中提取时区信息。

所以不要忘记调用pip install tzdata, 至少在 Windows 上。

于 2020-12-01T08:41:15.197 回答