Python 和 JavaScript 之间的 JSON 日期时间

2022-08-29 23:25:42

我想使用JSON从Python以序列化形式发送一个datetime.datetime对象,并使用JSON在JavaScript中反序列化。最好的方法是什么?


答案 1

您可以将“默认”参数添加到 json.dumps 中来处理此问题:

date_handler = lambda obj: (
    obj.isoformat()
    if isinstance(obj, (datetime.datetime, datetime.date))
    else None
)
json.dumps(datetime.datetime.now(), default=date_handler)
'"2010-04-20T20:08:21.634121"'

这是ISO 8601格式。

更全面的默认处理程序函数:

def handler(obj):
    if hasattr(obj, 'isoformat'):
        return obj.isoformat()
    elif isinstance(obj, ...):
        return ...
    else:
        raise TypeError, 'Object of type %s with value of %s is not JSON serializable' % (type(obj), repr(obj))

更新:添加了类型和值的输出。
更新:同时处理日期


答案 2

对于跨语言项目,我发现包含 RfC 3339 日期的字符串是最好的方法。RfC 3339 日期如下所示:

  1985-04-12T23:20:50.52Z

我认为大多数格式都是显而易见的。唯一有点不寻常的事情可能是最后的“Z”。它代表 GMT/UTC。您还可以添加一个时区偏移量,例如 CEST(夏季的德国)的 +02:00。我个人更喜欢将所有内容都保留在UTC中,直到它被显示出来。

为了显示,比较和存储,您可以将其保留为所有语言的字符串格式。如果您需要计算日期,请轻松将其转换回大多数语言的本机日期对象。

因此,生成如下 JSON:

  json.dump(datetime.now().strftime('%Y-%m-%dT%H:%M:%SZ'))

不幸的是,Javascript的Date构造函数不接受RfC 3339字符串,但互联网上有很多解析器

huTools.hujson试图处理您在Python代码中可能遇到的最常见的编码问题,包括日期/日期时间对象,同时正确处理时区。