如何使用javascript、JSON、python和mongodb之间的日期时间

How to work with datetimes betwixt javascript, JSON, and python, and mongodb?

本文关键字:之间 日期 时间 mongodb python 何使用 javascript JSON      更新时间:2023-09-26

同事和我一起开发了一个小应用程序,它在浏览器中使用了一堆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整数吗?在这种格式之间,建议双方使用什么方法?或者我们应该坚持使用整数,然后我们应该使用哪些方法?

在处理时间问题时,显然需要考虑很多需求。然而,如果您想在用户所在的时区维护显示给用户的日期/时间,并使用mongo/python/java/javascript,我使用了ISO 8601日期格式,并始终存储UTC(祖鲁语)时间。此外,如果您真的想保持某件事发生的实际时间,您不仅需要存储"日期/时间",还需要存储事件发生的"时区"(例如IANA时区字符串)。

对于一生的阅读,你可以搜索"约会时间最佳实践"。这个答案在讨论中有一个良好的开端:夏令时和时区最佳实践

好吧,现在到代码(如果你搜索,所有这些都可以在互联网上找到"parse||输出ISO 8601解析"(例如"python parse ISO 8601日期字符串"):

  1. JSON-在JavaScript和Python后端之间发送一个复杂的(如果不需要保留时区,可以很简单)对象,该对象具有ISO-8601格式的字符串和存储时区字符串的字符串:
    { "dateTime": "1970-07-10T12:00:00.047Z", "timeZone": "America/New_York" }
  2. Java脚本

    a。read datetime string JavaScript:哪些浏览器支持用Date.parse解析ISO-8601日期字符串
    var d = Date.parse("2011-04-26T13:16:50Z");
    b.编写日期时间字符串如何用JavaScript输出ISO 8601格式的字符串
    var date = new Date(); date.toISOString(); //"2011-12-19T15:28:46.493Z"

  3. Python

    a。read datetime string如何将ISO 8601日期时间字符串转换为Python日期时间对象
    import dateutil.parser yourdate = dateutil.parser.parse(datestring)
    b.编写日期时间字符串Python-将日期转换为ISO 8601
    import dateutil.parser as parser date.isoformat()

  4. Mongo-将日期时间存储为本地日期时间字段http://docs.mongodb.org/manual/reference/mongodb-extended-json/#date
    a.存储日期时间字符串(注意"$date",并且日期时间以ZULU/UTC(用'Z'表示)表示):
    "dateTime" : { "$date" : "1970-07-10T13:00:00.047Z"}

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