如何在我的时区中正确表示不同的时区?以下示例仅有效,因为我知道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()
答案 0 :(得分:37)
我在使用时区时建议使用babel
和pytz
。保持内部日期时间对象的天真和UTC,并转换为您的时区仅用于格式化。你可能想要天真的对象(没有时区信息的对象)的原因是很多库和数据库适配器都不知道时区。
答案 1 :(得分:10)
Python标准库不包含时区信息,因为遗憾的是时区数据的变化速度比Python快得多。你需要一个第三方模块;通常的选择是pytz
答案 2 :(得分: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
将为零(尽管如果某个地区最近更改了其夏令时法,这可能不正确)。
答案 3 :(得分:1)
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
还请注意this section from the docs:
zoneinfo模块不直接提供时区数据,而是从系统时区数据库或第一方PyPI软件包tzdata(如果有)中提取时区信息。
因此,至少不要忘记在Windows上调用pip install tzdata
。
答案 4 :(得分:-2)
我们熟悉从GMT(现在是UTC)切断的时区,但Python从西方切断时区。这就是为什么Python中存在负时区截止的原因,我相信。