将基于GMT的时间转换为UTC的Python代码
我从数据库里拿到一个日期,格式是 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>)