你这个理解的也不对。。。tzdata 本身就是个数据库
不是“我想用哪个”,而是这个“地名时区”对应到那个特定的时间的 delta 是多少。
切换是根据你的日期本身自动做的,这也就是必须用 normalize 的原因,replace
只是简单的把 tz 换掉,而不会帮你选择 tz 里正确的那个 delta 。
因为中国(至少现在)不用夏令时,所以一般人不会意识到时区不是稳定的。
你觉得用 Asia/Shanghai + normalize 就符合你的预期了吗?
>>> utc = pytz.timezone('UTC')
>>> shanghai = pytz.timezone('Asia/Shanghai')
>>> t = datetime.datetime.utcfromtimestamp(684809999).replace(tzinfo=utc)
>>> shanghai.normalize(t)
datetime.datetime(1991, 9, 15, 1, 59, 59, tzinfo=<DstTzInfo 'Asia/Shanghai' CDT+9:00:00 DST>)
>>> shanghai.normalize(t + datetime.timedelta(seconds=1))
datetime.datetime(1991, 9, 15, 1, 0, tzinfo=<DstTzInfo 'Asia/Shanghai' CST+8:00:00 STD>)
>>> shanghai.normalize(t + datetime.timedelta(seconds=1)).strftime('%Y-%m-%d %H:%M:%S')
'1991-09-15 01:00:00'
>>> shanghai.normalize(t + datetime.timedelta(seconds=-3599)).strftime('%Y-%m-%d %H:%M:%S')
'1991-09-15 01:00:00'
那天真的有两个凌晨1点。
这本来就不是个技术问题,tzdata 本身就是一帮志愿者维护的,包括这个地方平时
到 UTC+8 的切换,历史上(1900 年)是不是真的发生过,我觉得没人知道。
所以最好是别用 Asia/Shanghai 这种出问题的表示方法。直接自己造一个永久的
UTC+8 就得了。
【 在 Madlee (无竹居士) 的大作中提到: 】
: 就算有也应该用个单独的属性表示,大部分人还是会用地方的标准时间吧。
: 同一个Asia/Shanghai 表示的即可能是
: <DstTzInfo 'Asia/Shanghai' CST+8:00:00 STD>
: 也可能是
: <DstTzInfo 'Asia/Shanghai' LMT+8:06:00 STD>
: 关键还不知道怎么切换,太奇葩了。
--
修改:wincss FROM 114.242.94.*
FROM 114.242.94.*