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