何回やっても鬼門だし何度やっても間違えるし、何回出てきても忘れる、な。
日付時刻の扱いは Python に限らず「ウザ」い、のは、「UTCだけが世界だ」と積算秒形式に対して言わなかったがため。「1970年1月1日からの積算秒」が現地ローカルで計算され始めた時点で世界は終わた。
「データはデータ、表現は別問題」という発想さえあったらば、こんな混乱、なかったはずなんだな。
さて。日付時刻まわり、ですけど、「それでもことさらに標準 Python ではウザい」のは結局のところ、標準の tzinfo を用意してくれてないからな:
1 import datetime
2
3 class UTC(datetime.tzinfo):
4 def utcoffset(self, dt):
5 return datetime.timedelta(hours=0)
6 def dst(self, dt):
7 return datetime.timedelta(0)
8 def tzname(self, dt):
9 return 'UTC'
10
11 class JST(datetime.tzinfo):
12 def utcoffset(self, dt):
13 return datetime.timedelta(hours=9)
14 def dst(self, dt):
15 return datetime.timedelta(0)
16 def tzname(self, dt):
17 return 'JST'
こんなん毎度当然忘れるし、ってとこまではまぁ「毎度のこと」なんだけれど、「今回毎度」に迫られたのはこんなニーズ:
- UTCの UNIX TIME を手持ち
- 「明暗」(DayTime/NightTime)を知るには是が非でも「現地時間」が必要だ
これだけ。あぁ、こんなでいいのか…
1 Python 2.7.3 (default, Jul 24 2012, 11:41:40)
2 [GCC 4.6.3 20120306 (Red Hat 4.6.3-2)] on linux2
3 Type "help", "copyright", "credits" or "license" for more information.
4 >>> import datetime
5 >>>
6 >>> class UTC(datetime.tzinfo):
7 ... def utcoffset(self, dt):
8 ... return datetime.timedelta(hours=0)
9 ... def dst(self, dt):
10 ... return datetime.timedelta(0)
11 ... def tzname(self, dt):
12 ... return 'UTC'
13 ...
14 >>> class JST(datetime.tzinfo):
15 ... def utcoffset(self, dt):
16 ... return datetime.timedelta(hours=9)
17 ... def dst(self, dt):
18 ... return datetime.timedelta(0)
19 ... def tzname(self, dt):
20 ... return 'JST'
21 ...
22 >>> dt1 = datetime.datetime.fromtimestamp(1337914193, UTC())
23 >>> dt2 = dt1.astimezone(JST())
24 >>> print(dt1.strftime("%X %Z"))
25 02:49:53 UTC
26 >>> print(dt2.strftime("%X %Z"))
27 11:49:53 JST
なんてことをアタシのサイトで知ろうとせずに、もっと丁寧に色々言及してるPythonの日付処理とTimeZone | Nekoya Pressなどをみなはれ。ありがたや…。