如何在python中使用带有日期时间对象的时区?

How do I use timezones with a datetime object in python?

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
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()


我建议在使用时区时使用babelpytz。保持内部日期时间对象的原始性和UTC格式,并将其转换为时区以仅进行格式设置。您可能需要原始对象(没有时区信息的对象)的原因是许多库和数据库适配器不知道时区。

  • 巴别塔
  • 吡兹


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


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

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


我们很熟悉格林尼治标准时间(现在是UTC)的时区限制,但python采用的时区限制是西方的。这就是为什么python中存在负的时区限制,我相信。