我的基于 Python 的 Web 服务器需要使用客户端的时区(由其 UTC 偏移量表示)执行一些日期操作。如何构造具有指定 UTC 偏移量作为时区的日期时间对象?
使用 dateutil
:
>>> import datetime
>>> import dateutil.tz
>>> datetime.datetime(2013, 9, 11, 0, 17, tzinfo=dateutil.tz.tzoffset(None, 9*60*60))
datetime.datetime(2013, 9, 11, 0, 17, tzinfo=tzoffset(None, 32400))
>>> datetime.datetime(2013, 9, 11, 0, 17, tzinfo=dateutil.tz.tzoffset('KST', 9*60*60))
datetime.datetime(2013, 9, 11, 0, 17, tzinfo=tzoffset('KST', 32400))
>>> dateutil.parser.parse('2013/09/11 00:17 +0900')
datetime.datetime(2013, 9, 11, 0, 17, tzinfo=tzoffset(None, 32400))
顺便说一句,Python 3(从 v3.2 开始)现在有一个时区类来做到这一点:
from datetime import datetime, timezone, timedelta
# offset is in seconds
utc_offset = lambda offset: timezone(timedelta(seconds=offset))
datetime(*args, tzinfo=utc_offset(x))
但是,请注意,"此类对象不能用于表示在一年中的不同日期使用不同偏移量或对民用时间进行历史更改的位置中的时区信息。对于严格依赖 UTC 偏移量的任何时区转换,通常都是如此。
datetime
模块文档包含一个表示固定偏移量的示例tzinfo
类。
ZERO = timedelta(0)
# A class building tzinfo objects for fixed-offset time zones.
# Note that FixedOffset(0, "UTC") is a different way to build a
# UTC tzinfo object.
class FixedOffset(tzinfo):
"""Fixed offset in minutes east from UTC."""
def __init__(self, offset, name):
self.__offset = timedelta(minutes = offset)
self.__name = name
def utcoffset(self, dt):
return self.__offset
def tzname(self, dt):
return self.__name
def dst(self, dt):
return ZERO
从 Python 3.2 开始,不再需要提供此代码,因为datetime.timezone
和datetime.timezone.utc
包含在datetime
模块中,应该改用。