Python中的时区转换

Python中的时区转换,python,datetime,timezone,pytz,Python,Datetime,Timezone,Pytz,我可能遗漏了一些关于时区的信息: >>> import datetime, pytz >>> date = datetime.datetime(2013,9,3,16,0, tzinfo=pytz.timezone("Europe/Paris")) >>> date.astimezone(pytz.UTC) datetime.datetime(2013, 9, 3, 15, 51, tzinfo=<UTC>) 导入日期时间,py

我可能遗漏了一些关于时区的信息:

>>> import datetime, pytz
>>> date = datetime.datetime(2013,9,3,16,0, tzinfo=pytz.timezone("Europe/Paris"))
>>> date.astimezone(pytz.UTC)
datetime.datetime(2013, 9, 3, 15, 51, tzinfo=<UTC>)
导入日期时间,pytz >>>date=datetime.datetime(2013,9,3,16,0,tzinfo=pytz.timezone(“欧洲/巴黎”)) >>>日期:astimezone(pytz.UTC) datetime.datetime(2013,9,3,15,51,tzinfo=) 我期待着

datetime.datetime(2013, 9, 3, 15, 00, tzinfo=<UTC>)
datetime.datetime(2013,9,3,15,00,tzinfo=)
谁能解释一下这51分钟是从哪里来的

谢谢

Jean-Philippe

UTC偏移量给出(
date.tzinfo.utcoffset(date)
):

这是540秒或9分钟

法国在1911年3月11日切换到UTC,时钟向后拨了9分21秒(,):

直到1911年,巴黎与UTC相差9分21秒


你也可以在这里看到它(),时间从3月11日12:01:00到3月10日11:51:39。谢谢Simeon的回答。这让我意识到我对这一切的理解是多么肤浅。下面的实验让我失去了更多

>>> import datetime, pytz
>>> date_paris = datetime.datetime(2013,9,3,16,0, tzinfo=pytz.timezone("Europe/Paris"))
>>> date_utc = datetime.datetime(2013,9,3,16,0, tzinfo=pytz.utc)
>>> date_paris.astimezone(pytz.utc)
datetime.datetime(2013, 9, 3, 15, 51, tzinfo=<UTC>)
>>> date_utc.astimezone(pytz.timezone("Europe/Paris"))
datetime.datetime(2013, 9, 3, 18, 0, tzinfo=<DstTzInfo 'Europe/Paris' CEST+2:00:00 DST>)
导入日期时间,pytz >>>date_paris=datetime.datetime(2013,9,3,16,0,tzinfo=pytz.timezone(“欧洲/巴黎”)) >>>日期utc=datetime.datetime(2013,9,3,16,0,tzinfo=pytz.utc) >>>巴黎阿斯蒂梅佐内(pytz.utc)的日期 datetime.datetime(2013,9,3,15,51,tzinfo=) >>>日期utc时区(pytz时区(“欧洲/巴黎”)) datetime.datetime(2013,9,3,18,0,tzinfo=) 为什么在一个方向转换时会出现9分钟的偏移,而在另一个方向转换时却不会出现?下面的代码集中了所有的失望:

>>> date_paris
datetime.datetime(2013, 9, 3, 16, 0, tzinfo=<DstTzInfo 'Europe/Paris' PMT+0:09:00 STD>)
>>> date_paris.astimezone(pytz.utc).astimezone(pytz.timezone("Europe/Paris"))
datetime.datetime(2013, 9, 3, 17, 51, tzinfo=<DstTzInfo 'Europe/Paris' CEST+2:00:00 DST>) 
巴黎日期 datetime.datetime(2013,9,3,16,0,tzinfo=) >>>日期/巴黎时区(pytz.utc).astimezone(pytz.timezone(“欧洲/巴黎”)) datetime.datetime(2013,9,3,17,51,tzinfo=)
阅读本书开头的注释;使用
.localize()
方法创建时区感知的datetime对象:

import datetime
import pytz

naive_dt = datetime.datetime(2013,9,3,16,0)
dt = pytz.timezone("Europe/Paris").localize(naive_dt, is_dst=None)

to_s = lambda d: d.strftime('%Y-%m-%d %H:%M:%S %Z%z')
print(to_s(dt))
print(to_s(dt.astimezone(pytz.utc)))
输出
我不知道你为什么要在这里等协调世界时15:00。

这似乎很奇怪。。完全出乎意料。看来我完全误解了UTC的真正含义!好吧,维基百科将中欧时间定义为“比协调世界时(UTC)提前1小时。与UTC的时间偏移可以写成+01:00”。我完全迷路了。
import datetime
import pytz

naive_dt = datetime.datetime(2013,9,3,16,0)
dt = pytz.timezone("Europe/Paris").localize(naive_dt, is_dst=None)

to_s = lambda d: d.strftime('%Y-%m-%d %H:%M:%S %Z%z')
print(to_s(dt))
print(to_s(dt.astimezone(pytz.utc)))
2013-09-03 16:00:00 CEST+0200
2013-09-03 14:00:00 UTC+0000