如何在python中将时区与datetime对象一起使用?

时间:2020-03-06 14:33:54  来源:igfitidea点击:

如何正确表示时区中的其他时区?下面的示例仅起作用,因为我知道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()

解决方案

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

在使用时区时,我建议使用" babel"和" pytz"。将内部日期时间对象保持为天真且采用UTC格式,并转换为时区以仅进行格式化。之所以可能想要朴素的对象(没有时区信息的对象),是因为许多库和数据库适配器对时区一无所知。

  • 巴别塔
  • pytz

对于当前的本地时区,我们可以使用:

>>> 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"将为零(尽管如果某个地区最近更改了其夏令时法,这可能是不正确的)。