【问题标题】:How to work with datetimes betwixt javascript, JSON, and python, and mongodb?如何在 javascript、JSON、python 和 mongodb 之间使用日期时间?
【发布时间】:2014-10-30 20:53:25
【问题描述】:

我和同事拼凑了一个小应用程序,它在浏览器中使用一堆 JS,并通过 JSON 与 Tornado (Python3) 服务器通信,服务器使用 mongodb 作为持久数据的后备存储。这对我们俩来说都是第一次。

我们发现困难的是如何在 JS 和 Python 之间交换日期时间信息。我们确实相信我们应该为所有事情使用 UTC 时间。 JSON 没有日期时间文字,因此我们必须以某种方式对其进行编码。我们从 1970 年开始天真地(?)使用 JS 的毫秒概念,并且一直在来回共享大整数。因此,JS 代码现在可能会通过以下方式获取当前的 UTC:

var newTime = new Date().getTime();

在 Python3/mongo 方面,我们希望使用真正的 datetime 对象,因此我们将其转换为:

datetime.datetime.utcfromtimestamp(jsMilliseconds / 1000)

但是当我们必须发回日期时,说 Python3 对象只有一个timestamp() 方法。而往返似乎并没有创造相同的时间。所以我们对此感到很沮丧。

我们正在寻找有经验的人来为我们提供一套好的习语以供在这里使用。当与 JSON 来回传递时,我们应该使用字符串而不是 ms 整数吗?在这种格式之间使用双方推荐的方法是什么?或者我们应该坚持使用整数,然后我们应该使用哪些方法?

【问题讨论】:

    标签: javascript python json datetime python-3.x


    【解决方案1】:

    在处理时间时显然需要考虑很多要求。但是,如果您想在他们的时区中向用户显示日期/时间并使用 mongo/python/java/javascript,我使用了 ISO 8601 日期格式并始终存储 UTC (Zulu) 时间。此外,如果您真的想维护发生某事的实际时间,您不仅需要存储“日期/时间”,还需要存储“时区”(例如 IANA 时区字符串) 事件发生的地方。

    终身阅读,您可以搜索“日期时间最佳实践”。这个答案有一个很好的讨论开始:Daylight saving time and time zone best practices

    好的,现在进入代码(如果您搜索所有这些都可以在互联网上轻松找到 “解析||输出 ISO 8601 解析”(例如“python 解析 ISO 8601 日期字符串”):

    1. JSON - 在 JavaScript 和 Python 后端之间的线路上发送一个复杂的(如果您不需要保留时区,可以很简单)对象,其中包含 ISO-8601 格式的字符串和用于存储时区字符串的字符串:
      @987654329 @
    2. Java 脚本

      一个。读取日期时间字符串JavaScript: Which browsers support parsing of ISO-8601 Date String with Date.parse
      var d = Date.parse("2011-04-26T13:16:50Z");
      湾。写日期时间字符串How do I output an ISO 8601 formatted string in JavaScript?
      var date = new Date(); date.toISOString(); //"2011-12-19T15:28:46.493Z"

    3. Python

      一个。读取日期时间字符串How do I translate a ISO 8601 datetime string into a Python datetime object?
      import dateutil.parser yourdate = dateutil.parser.parse(datestring)
      湾。写日期时间字符串Python - Convert date to ISO 8601
      import dateutil.parser as parser date.isoformat()

    4. Mongo - 将日期时间存储为本机日期时间字段http://docs.mongodb.org/manual/reference/mongodb-extended-json/#date
      一种。存储日期时间字符串(注意“$date”并且该日期时间在 ZULU/UTC 中(用“Z”表示)):
      "dateTime" : { "$date" : "1970-07-10T13:00:00.047Z"}

    参考:
    1. IANA 时区数据库http://en.wikipedia.org/wiki/Tz_database
    2. 谷歌日历 API(事件资源)也可以用作 RFC 3339 的示例(参见开始/结束):https://developers.google.com/google-apps/calendar/v3/reference/events

    【讨论】:

      猜你喜欢
      • 2010-10-02
      • 2021-05-11
      • 1970-01-01
      • 2014-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多