如何使用javascript、JSON、python和mongodb之间的日期时间
How to work with datetimes betwixt javascript, JSON, and python, and mongodb?
同事和我一起开发了一个小应用程序,它在浏览器中使用了一堆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日期字符串"):
- JSON-在JavaScript和Python后端之间发送一个复杂的(如果不需要保留时区,可以很简单)对象,该对象具有ISO-8601格式的字符串和存储时区字符串的字符串:
{ "dateTime": "1970-07-10T12:00:00.047Z", "timeZone": "America/New_York" }
-
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"
-
Python
a。read datetime string如何将ISO 8601日期时间字符串转换为Python日期时间对象
import dateutil.parser yourdate = dateutil.parser.parse(datestring)
b.编写日期时间字符串Python-将日期转换为ISO 8601import dateutil.parser as parser date.isoformat()
- 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
- 如何在javascript中获取两个日期之间的周六和周日的日期
- 如何用moment.js列出两个日期之间的所有月份
- 我希望这个日期选择器可以从1990年到2000年之间的年份中选择日期
- moment.js在两个时区格式的日期之间存在差异
- Javascript-如何使用bootstrap日期时间选择器自动计算两个时间输入之间的差异
- 用时间戳获取两个不同日期之间的时间差
- JavaScript函数,用于计算两个日期之间的年、月和天数
- 再次使用JavaScript计算两个日期之间的天数
- Mongoose查询在两个日期时间之间提取数据
- 在Javascript中计算两个日期之间的工作日,节假日除外
- 在Jquery或Javascript中获取两个范围或日期之间的通信周数
- 如何使用moment.js获取24小时内日期之间的时差
- 两个日期之间的差异
- JavaScript-计算两个日期之间的天数(包括结束日期)
- 在 JavaScript 中单击函数时两个日期类型输入之间的差异的代码
- Ext 4.2.1 模型日期解析在浏览器之间不一致
- 夏令时期间不起作用的 2 个日期之间的小时差异
- 如何在javascript中计算两个日期时间之间的差异
- 考虑到夏令时,Java和JavaScript之间“日期”交换的最佳实践
- 给定一个开始日期和结束日期,创建一个包含这两个日期之间日期的数组