如何从UTC到给定时区获取小时差异?

6

有没有办法获取UTC和给定时区之间的小时差呢?

例如,UTC和欧洲/阿姆斯特丹之间的差距是+2小时。

在Python中是否有相应的方法?


也许这会有用:http://stackoverflow.com/questions/6528391/python-how-to-get-utc-time-given-timezone - mmot
1
你尝试过 pytz 吗? - Rohan
@MariaZverina 我有一个datetime对象,它目前处于UTC+2格式(欧洲/阿姆斯特丹)。我必须将其转换回UTC。如果我可以获得“欧洲/阿姆斯特丹”和UTC之间的时间差,即-2,那么这将很容易。然后我可以做类似这样的事情:mydate = nlDate - timedelte(hours=2)。我只是不知道如何获取两个时区之间的差异。 - w00
1个回答

6
假设您有一个带时区的日期时间:
import datetime
import pytz

d = datetime.datetime(2012, 1, 1, 0, 0, 0, tzinfo=pytz.utc)
In [54]: d
Out[54]: datetime.datetime(2012, 1, 1, 0, 0, tzinfo=<UTC>)

要将此转换为阿姆斯特丹时间,请使用:

ams = pytz.timezone('Europe/Amsterdam')

In [55]: d.astimezone(ams)
Out[55]: datetime.datetime(2012, 1, 1, 1, 0, tzinfo=<DstTzInfo 'Europe/Amsterdam' CET+1:00:00 STD>)

pst = timezone('US/Pacific')
In [118]: d.astimezone(pst)
Out[118]: datetime.datetime(2011, 12, 31, 16, 0, tzinfo=<DstTzInfo 'US/Pacific' PST-1 day, 16:00:00 STD>)

如果我们有一个没有时区的日期时间(naive datetime),我们可以这样转换它:
dd = datetime.datetime(2012, 2, 2, 0, 0)
ams.localize(naive_dt).astimezone(pst)  # set it as 'ams' first, then convert to pst
Out[131]: datetime.datetime(2012, 2, 1, 15, 0, tzinfo=<DstTzInfo 'US/Pacific' PST-1 day, 16:00:00 STD>)

查看两个时区之间的差异:

In [137]: ams.utcoffset(datetime.datetime(2012,1,1))
Out[137]: datetime.timedelta(0, 3600)

In [138]: pst.utcoffset(datetime.datetime(2012,1,1))
Out[138]: datetime.timedelta(-1, 57600)

根据UTC时间,AMS地区为+1小时,而PST地区为-8小时(需要往前推一天并加16小时)。

编辑:如文档所述(链接),此处意思是:

datetime(2002, 10, 27, 12, 0, 0, tzinfo=amsterdam)

将不起作用。


你可能应该提到夏令时。 - Prof. Falken
pytz 的 utcoffset 会在大多数 DST 时区的一年中扔出一个 AmbiguousTimeError,除非您提供 is_dst kwarg 参数。请参见 http://pytz.sourceforge.net/#tzinfo-api。我建议避开它。 - Mike Fogel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接