xmllibrpc.DateTimeとdatetime.datetimeの変換
pyapnsを使っていて、feedbackのレスポンスがexpired_dateとtokenのタプルのリストなんだけど、expired_dateがdatetime.datetimeだと思って処理を書いてたら、xmllibrpc.DateTimeオブジェクトだったので変換処理をメモ
http://docs.python.org/2/library/xmlrpclib.html#datetime-objects
from pyapns import feedback import datetime feedbacks = feedback('app_id') for expired_date, token in feedbacks: # 変換 expired_date = datetime.datetime.strptime(expired_date.value, "%Y%m%dT%H:%M:%S")
ついでに書いとくと上記の変換で得られたexpired_dateはtimezoneを持っていない(naive)ので、timezoneを持っているdatetime(aware)と比較できない
pyapnsのfeedbackのserver側の処理はこんな感じでdatetimeはfromtimestampで作成している
def decode_feedback(binary_tuples): """ Returns a list of tuples in (datetime, token_str) format binary_tuples the binary-encoded feedback tuples """ fmt = '!lh32s' size = struct.calcsize(fmt) with StringIO(binary_tuples) as f: return [(datetime.datetime.fromtimestamp(ts), binascii.hexlify(tok)) for ts, toklen, tok in (struct.unpack(fmt, tup) for tup in iter(lambda: f.read(size), ''))]
fromtimestampはtimezoneを渡さない場合、以下の様な挙動になるので、それを踏まえてtzinfoを設定するなりなんなりしましょう
オプションの引数 tz が None であるか、指定されて いない場合、タイムスタンプはプラットフォームのローカルな日付および 時刻に変換され、返される datetime オブジェクトは naive なものになります。
http://docs.python.jp/2.5/lib/datetime-datetime.html