タイムゾーンについて黒魔術的な質問があります。
タイムスタンプ付きのイベントが必要なアプリケーションがあります。すべてを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?