Pythonでタイムゾーンを扱うメモ

日本だと普段扱わないので、忘れがちなタイムゾーンの処理をメモ書きです。ここでは例として、日本時間とアメリカ東海岸標準時の変換してみます。

まず標準ライブラリだけで処理すると以下のような書き方をするようです。各時間帯ごとにdatetime.tzinfoを継承したクラスを作成し、その中でUTCからの時間のずれ等を設定します。

#!/usr/bin/python
# -*- coding: utf-8 -*-

import datetime

# 日本時間
class JST(datetime.tzinfo):
  # UTCからの時間のずれ  
  def utcoffset(self, dt):
    return datetime.timedelta(hours=9)
  # サマータイム  
  def dst(self, dt): 
    return datetime.timedelta(0)
 # タイムゾーンの名前  
  def tzname(self, dt):
    return 'JST'

# 東海岸
class EST(datetime.tzinfo):
  def utcoffset(self, dt):
    return datetime.timedelta(hours=-5)
  def dst(self, dt): 
    return datetime.timedelta(0)
  def tzname(self, dt):
    return 'EST'

# 東海岸時間を
eastern_time = datetime.datetime.now(EST())
print eastern_time # 2010-08-09 14:42:17.378746-05:00

# 日本時間に変換
japan_time = eastern_time.astimezone(JST())
print japan_time  # 2010-08-10 04:42:17.378746+09:00

まぁ言うほど難しくもないのですが面倒です。サブクラスを毎回作るのも面倒ですし、各時間帯のUTCからのずれなどを意識しないといけないのも辛いです。そこでもっと簡単にならないのと思って調べてみるとpytzというモジュールを使うのがよさそうです。pytzで先ほどの処理を書き直すと以下になります。

#!/usr/bin/python
# -*- coding: utf-8 -*-

import pytz
from datetime import datetime

eastern_time = datetime.now(pytz.timezone('EST'))
print eastern_time
japan_time = eastern_time.astimezone(pytz.timezone('Asia/Tokyo'))
print japan_time

かなりシンプルになりました。pytzは内部に主要都市のタイムゾーンをデータベース的に持っていて、名前から引くことができます。以下に使い方をまとめておきます。

#!/usr/bin/python
# -*- coding: utf-8 -*-

import pytz
from datetime import datetime

# 使えるタイムゾーンの名前を確認
print pytz.common_timezones
print pytz.country_timezones

# 確認したタイムゾーン名からオブジェクトを作成
utc = pytz.timezone('UTC')
jst = pytz.timezone('Asia/Tokyo')
bst = pytz.timezone('Europe/London')

# 現在の、各タイムゾーンのローカル時刻を得る
print datetime.now(utc)  # 2010-08-09 21:24:08.865154+00:00
print datetime.now(jst)  # 2010-08-10 06:24:08.865194+09:00
print datetime.now(bst)  # 2010-08-09 22:24:08.865229+01:00

# タイムゾーンの変換
jst_dt = datetime(2010, 8, 10, 6, 25, tzinfo=jst)
print jst_dt
print jst_dt.astimezone(utc)
print jst_dt.astimezone(bst)

# サマータイムも考慮される
print bst.localize(datetime(2010, 1, 1))  # 2010-01-01 00:00:00+00:00
print bst.localize(datetime(2010, 8, 1))  # 2010-08-01 00:00:00+01:00

これでタイムゾーンが簡単に扱えますね。早くグローバル対応なサービス作っていきたいです。

1 thought on “Pythonでタイムゾーンを扱うメモ”

Leave a Reply

Your email address will not be published. Required fields are marked *