如何在python中使用datetime对象的时区?

我如何正确地在我的时区中表示不同的时区? 下面的例子只能用,因为我知道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() 

在使用时区时,我build议使用babelpytz 。 保持您的内部date时间对象天真和UTC,并转换为您的时区只格式。 你可能想要天真的对象(没有时区信息的对象)的原因是许多库和数据库适配器不知道时区。

  • 巴别塔
  • pytz

Python标准库不包含时区信息,因为不幸的是时区数据的变化比Python快得多。 你需要一个第三方模块。 通常的select是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如果夏令时目前不生效, localtime().tm_isdst将为零(尽pipe如果一个地区最近改变了夏令时法则,这可能是不正确的)。

我们对格林尼治标准时间(现在是UTC)的时区已经很熟悉,但是Python需要从西方切断时区。 所以我相信这就是为什么Python中存在负面的时区截断的原因。