FC2ブログ

本を読む

読書やコンピュータなどに関するメモ

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ブランチに置いておきました。

コメント

コメントの投稿

管理者にだけ表示を許可する

トラックバック

http://emasaka.blog65.fc2.com/tb.php/1449-3e44a15a

 | HOME | 

Categories

Recent Entries

Recent Comments

Recent Trackbacks

Appendix

emasaka

emasaka

フリーター。
連絡先はこのへん

Monthly


FC2Ad