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() |
我建议在使用时区时使用
- 巴别塔
- 吡兹
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以东的区域的值为负值)。这与我们实际想要的正好相反,因此我们选择了
如果夏令时目前没有生效,则
我们很熟悉格林尼治标准时间(现在是UTC)的时区限制,但python采用的时区限制是西方的。这就是为什么python中存在负的时区限制,我相信。