将基于GMT的时间转换为UTC的Python代码

1 投票
2 回答
9434 浏览
提问于 2025-04-18 17:45

我从数据库里拿到一个日期,格式是 2014/08/19 03:38:46 GMT-4

我该怎么把这个日期转换成UTC格式的日期呢?

附注:我用的是Python 2.6.6。

2 个回答

1

GMT-4 这个说法有点模糊:它指的是美国的时间(-0400 的 UTC 偏移)还是俄罗斯莫斯科的时间(+0400)呢?

$ TZ=GMT-4 date +%Z%z
GMT+0400
$ TZ=UTC-4 date +%Z%z
UTC+0400
$ TZ=America/New_York date +%Z%z
EDT-0400
$ TZ=Europe/Moscow date +%Z%z
MSK+0400

你的评论暗示 你可能需要把 UTC 偏移的符号反过来。

Python 2.6 的标准库里没有固定偏移的时区。你可以参考 datetime 文档中的示例实现

from datetime import tzinfo, timedelta, datetime

ZERO = timedelta(0)

class FixedOffset(tzinfo):
    """Fixed UTC offset: `local = utc + offset`."""

    def __init__(self, offset, name):
        self.__offset = timedelta(hours=offset)
        self.__name = name

    def utcoffset(self, dt):
        return self.__offset

    def tzname(self, dt):
        return self.__name

    def dst(self, dt):
        return ZERO

utc = FixedOffset(0, "UTC")

然后要解析时间字符串,你可以使用 strptime() 方法:

dt = datetime.strptime("2014/08/19 03:38:46 GMT-4", "%Y/%m/%d %H:%M:%S GMT-4")
aware = dt.replace(tzinfo=FixedOffset(-4, "GMT-4"))
print(aware)                 # -> 2014-08-19 03:38:46-04:00
print(aware.astimezone(utc)) # -> 2014-08-19 07:38:46+00:00
4

如果你有一个不是很简单的日期时间对象,你只需要用你想要的时区来调用 astimezone 方法。

>>> import pytz
>>> from dateutil import parser
# dateutil.parser get a datetime object from string, we ensure that is a non-naive datetime
>>> parser.parse('2014/08/19 03:38:46 GMT-4')
datetime.datetime(2014, 8, 19, 3, 38, 46, tzinfo=tzoffset(None, 14400))
>>> dt = parser.parse('2014/08/19 03:38:46 GMT-4')
>>> dt.astimezone (pytz.utc)
datetime.datetime(2014, 8, 18, 23, 38, 46, tzinfo=<UTC>)

你在评论中说得对,UTC时间应该放在后面。所以在我考虑其他解决方案的时候,这个怎么样呢?

>>> dt = parser.parse('2014/08/19 03:38:46 GMT-4')
>>> dt.replace(tzinfo=pytz.utc) + dt.tzinfo._offset
datetime.datetime(2014, 8, 19, 7, 38, 46, tzinfo=<UTC>)

撰写回答