我有一个关于时区的黑魔法问题。
我有一个需要时间戳事件的应用程序。我将所有内容都存储在 UTC 中。但是,我想显示(客户端)日期,既不是在用户语言环境中也不是在 UTC 中,而是在给定的时区(即巴黎时区)中。
由于没有 javascript 方法可以轻松地做到这一点(我们必须使用类似 timezone.js 的东西来知道确切的夏令时事件,这似乎有点过分了),我想做以下技巧:
- 获取 UTC 日期
dutc=datetime(…,<UTC>)
- 将其转换为巴黎日期
dparis=datetime(…,<Paris>)
- 强制 tzinfo 回到 UTC 以获取与巴黎日期和时间相对应的 UTC 时间戳(例如,相同的数字日期和时间,但使用 UTC 而不是巴黎,不添加或删除小时)
- 将此 UTC 日期存储为时间戳,以便客户端可以将其解析为“假 UTC”时间戳,并显示“假时间”
但是,我没有取回原来的时间戳
import datetime
import time
import pytz
utc = pytz.UTC
paris = pytz.timezone('Europe/Paris')
t = 1372982409 # timestamp in UTC
dutc = datetime.datetime.fromtimestamp(t, utc) # date in UTC
# datetime.datetime(2013, 7, 5, 0, 0, 9, tzinfo=<UTC>)
dparis = datetime.datetime.fromtimestamp(t, paris) # date in Paris time
# datetime.datetime(2013, 7, 5, 2, 0, 9, tzinfo=<DstTzInfo 'Europe/Paris' CEST+2:0
0:00 DST>)
dparisasutc = dparis.replace(tzinfo=utc) # force the date in UTC time
# datetime.datetime(2013, 7, 5, 2, 0, 9, tzinfo=<UTC>)
t0 = time.mktime(dparisasutc.timetuple())
# 1372986009.0
datetime.datetime.fromtimestamp(t0)
# datetime.datetime(2013, 7, 5, 3, 0, 9) # why not 02:00:09?