この投稿、読むべからず (FAQ 過ぎて)

何回やっても鬼門だし何度やっても間違えるし、何回出てきても忘れる、な。

日付時刻の扱いは 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'

こんなん毎度当然忘れるし、ってとこまではまぁ「毎度のこと」なんだけれど、「今回毎度」に迫られたのはこんなニーズ:

  1. UTCの UNIX TIME を手持ち
  2. 「明暗」(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などをみなはれ。ありがたや…。