21

我的基于 Python 的 Web 服务器需要使用客户端的时区(由其 UTC 偏移量表示)执行一些日期操作。如何以指定的 UTC 偏移量作为时区构造 datetime 对象?

4

3 回答 3

25

使用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))
于 2013-09-10T15:22:39.437 回答
18

顺便说一句,Python 3(从 v3.2 开始)现在有一个timezone 类可以做到这一点:

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 偏移量的任何时区转换,这通常是正确的。

于 2014-07-04T17:51:58.607 回答
8

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.timezonedatetime.timezone.utc包含在datetime模块中,应改为使用。

于 2013-09-10T15:09:48.250 回答