前へ[ PHP xmlrpc patched version R3 ]
[ THR_KEY_mysys ]
次へ 
python datetime 型を Unix timestamp に変換するうまい方法がないものかと、長年懸案事項だったのですけれど、ふといい方法を思いつきました。
import datetime
import time
import iso8601
def totimestamp(tm):
if tm.tzinfo and tm.tzinfo.utcoffset(tm)!=None:
i=tm-datetime.datetime.fromtimestamp(0, iso8601.iso8601.Utc())
return i.days*86400 + i.seconds + i.microseconds/1000000.0
else:
return time.mktime(tm.timetuple())
iso8601 は
http://pypi.python.org/pypi/iso8601 
を使っていますが、この例であれば UTC timezone を示すクラスのために使っています。
ISO 8601 形式の Datetime 表現は現在の Web で、いたるところで出てきます。python では 8601 形式の文字列を出力するのが非常に簡単な一方で、入力として受け取るのは異常なほど苦手です。
http://wiki.python.org/moin/WorkingWithTime 
に、よくまとめられていますが、標準ライブラリだけでは扱えません。たとえば iso8601 ライブラリを使うことになります。
iso8601 ライブラリで python 標準ライブラリの datetime 型には変換できます。ところがこのオブジェクトが一癖あるもので、タイムスタンプへの変換はかなり難しいです。Web 上にある情報を探すと time.mktime(some_datetime_object.timetuple()) となっている例をみかけるでしょう。しかし、これは間違っています。使ってはいけません。この計算は timezone の計算ができていませんので、このままいくなら timezone の補正計算をしなければなりません。
http://bugs.python.org/issue1457227 
は rejected で close していますが、採用されなくてよかったと思います。
もうひとつの方法は strftime で %s を使う方法です。これも悪くは無いのですが、一度文字列に変換される上に秒以下の精度がなくなってしまうのが難点です。また %s は少し特殊な仕様(Olson)で規定されているため、たとえば Windows 上では使えないのも困ったものです。
上の例は発想を転換して、そもそも Unix / POSIX timestamp が 1970-01-01T00:00:00Z からの経過時間である、という原点に立ち戻って計算をしています。