CouchDB中存储日期时间(时间戳)的最佳方法是什么?

28

我认为像2011-01-26 21:41:09 +0000这样的UTC时间字符串,如果在视图键中使用,它们可以正确排序,但存储时区(例如2011-01-26 16:41:09 -0500)可以使文档更易读。从可读性角度来看,将日期转换为时期整数似乎是最不吸引人的选择,但也许对于性能来说最好(或者有什么区别吗?)。这里推荐采用什么做法?

5个回答

33

时间是一维的。时间戳加时区是二维的,描述了一个时间点和位置。Couch视图是一维的(但不包括GeoCouch插件),因此将数据存储在通用时区(UTC)中是明智的选择。

可能最具未来性的格式是按时间顺序自然排序的字符串。JSON2输出的可能是最方便的此类格式:

> a = new Date();
Thu Jan 27 2011 18:40:52 GMT+0700 (ICT)
> JSON.stringify(a)
"2011-01-27T11:40:52.280Z"

6
如果你只是使用Map reduce的Map部分,那么这些建议可能就够用了。如果你想对结果进行reduce操作(_count,_stats,_sum),那么我建议将日期作为数组输出,以便使用group_level。
例如,如果你在格式为“2011-02-14”的日期字符串上发出(doc.date.split('-')),那么你可以使用group_level=3、2和1来返回每天、每月和每年的_count等数据。
你还可以通过在键的开头添加非日期数据来进一步过滤数据。例如,如果你要输出Twitter名称,那么你的键可能看起来像["bigbluehat", "2011", "02", "14"],而你的reduce可以返回用户"bigbluehat"的所有推文总数,以及该用户在日、月和年方面的统计信息。
如果你不使用reduce,那么基于字符串的键可能就够用了。

5
无论我使用什么样的数据存储,通常都希望在其中包含一个unix时间戳字段,其中我将包括创建日期的时间戳,并且还要有一个更新字段,当文档更改时可以更改该字段。
我更喜欢常规的“自纪元以来的秒数”方法,而不是“自纪元以来的毫秒数”,仅仅因为它更加简洁。 Math.round(new Date().getTime()/1000) 对我来说非常好用。
就可读性而言,我想将其存储为整数以进行易于比较,并使用前端将其显示得漂亮。

1
毫无疑问,Unix时间戳是在任何系统中存储时间的最佳方式。我可以告诉你,这来自于我在机器人领域的背景,那里时间非常重要。 - msysmilu
2
Unix时间戳通常是一个不错的选择,但也有很多情况下它并不适用。例如,如果你在32位抵押计算器上使用Unix时间戳,当抵押贷款超过2038年时,Unix时间戳将无法继续运行,这时你就会遇到麻烦。 - Rich Remer

4

我喜欢使用自纪元以来的毫秒数。您可以通过以下方式计算出:

new Date().valueOf()

你可以使用以下代码通过毫秒数创建一个新的日期对象:

var milliseconds = new Date().valueOf();
var date = new Date(milliseconds);

我喜欢创建一个以毫秒为关键字的视图,因为这样排序会变得超级简单。
此外,我认为在处理CouchDB之外的数据时,使用整数比字符串更有效率。

4

你可以按照自己的方式存储日期,重要的是如何在视图中输出它们。

*只要Date.parse()能够读取它。

这里有一个很好的解决方案:在CouchDB视图中排序日期


+1 但我仍然推荐使用我的答案中的JSON2格式,因为时间戳可能在文档ID中,我们无法控制如何输出它。(存储日志是我看到很多时间戳直接在“_id”中的情况。) - JasonSmith

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接