<p>这里有几个陷阱:</p>
<p>首先,请不要在不知道日期时间对象的时区通信。你会感到痛苦,不是今天,也许不是明天,而是有一天。你可以从别人的错误(我的错误)中吸取教训,也可以从中吸取教训。就我而言,Python允许您生成不带时区的datetime对象是一个缺陷。在</p>
<p>第二,strptime不处理时区!所以你做了正确的事情,然后你用某种格式写下你的日期,然后想把它读回,卡布洛伊,你得到了'%z格式错误字符串。'Grr。在</p>
<p>使用iso8601库解析iso8601日期时间字符串。时区处理。在</p>
<p>第三,jsonpickle没有清楚地说明如何滚动您自己的DatetimeHandler。所以是的,你只是想要一些清晰易读的东西发送到Javascript或者别的什么?上面的解决方案就可以了。你想要一些清晰易读的东西,但你也希望在某个时候把它拉回到Python中?呃,更狡猾。在</p>
<p>这里有一个提示:当您将一个库子类化以扩展其功能时,请仔细查看您正在扩展的超类。在</p>
<p>我写DatetimeHandler时会有点不同。但下面的作品,包含了我在这个问题上来之不易的智慧。哎哟。在</p>
<pre><code>import pytz
import jsonpickle
import iso8601
from datetime import datetime
class Blah(object):
def __init__(self, blah):
self.datetime = datetime.now(pytz.utc)
self.blah = blah
def to_json(self):
return jsonpickle.encode(self)
@classmethod
def from_json(cls, json_str):
return jsonpickle.decode(json_str)
class DatePickleISO8601(jsonpickle.handlers.DatetimeHandler):
def flatten(self, obj, data):
pickler = self.context
if not pickler.unpicklable:
return unicode(obj)
cls, args = obj.__reduce__()
flatten = pickler.flatten
payload = obj.isoformat()
args = [payload] + [flatten(i, reset=False) for i in args[1:]]
data['__reduce__'] = (flatten(cls, reset=False), args)
return data
def restore(self, data):
cls, args = data['__reduce__']
unpickler = self.context
restore = unpickler.restore
cls = restore(cls, reset=False)
value = iso8601.parse_date(args[0])
return value
jsonpickle.handlers.registry.register(datetime, DatePickleISO8601)
</code></pre>