jpholidaypのローカルタイム依存をなくす問題
「(日本で)今日が休日かどうか」を判定するjpholidaypというツールを公開しています。100行ぐらいのPythonスクリプトです。もともと、素に近いサーバーにスクリプトを1つ入れるだけでcronから使える、というコンセプトで作りました。
jpholidaypのコードでは、「今日」の判定に、ローカルタイムがJST(日本時間)であることを前提にしています。しかし、ちょうどサマータイム論議もあるところだったりして、それってダサいよなーと思っています。
ただまあ、Python 2/3両対応とか、(できるだけ)追加モジュール不要とかを考えるといろいろ面倒だなあと。
今日を求めるコードは、現状ではこんな感じ。
from datetime import date today = date.today()
明示的にJSTを指定すると、Python 3ではこうなります。ただしPython 2では使えません。
from datetime import date, datetime, timedelta, timezone JST = timezone(timedelta(hours=9), 'JST') today = datetime.now(JST).date()
Python 2でも使えるようにするには、こうなります。
from datetime import date, datetime, timedelta, tzinfo class JST(tzinfo): def utcoffset(self, dt): return timedelta(hours=9) def tzname(self, dt): return 'JST' def dst(self, dt): return timedelta(0) today = datetime.now(JST()).date()
ただ、いずれにしても時差9時間固定で、サマータイムなどには対応していません。
そこで、Python 2/3とも、pytzライブラリを使えば、タイムゾーンのデータベースを使えます。
from datetime import date, datetime import pytz JST = pytz.timezone('Asia/Tokyo') today = datetime.now(JST).date()
ただ、pytzライブラリを追加する必要があるのが、冒頭のコンセプトからすると、少しだけ考えてしまうところです。
とりあえずpytzによる実装をpytzブランチに置いておきました。
コメント
コメントの投稿
トラックバック
https://emasaka.blog.fc2.com/tb.php/1449-3e44a15a