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

时间:2011-01-27 02:48:46

标签: json datetime couchdb

我认为像2011-01-26 21:41:09 +0000这样的UTC时间字符串可能没问题,因为它们在视图键中使用时排序正确,但存储时区(例如2011-01-26 16:41:09 -0500)会使文档成为文档更具可读性。从可读性的角度来看,将日期转换为纪元整数似乎是最不吸引人的,但也许最适合性能(或者它是否有所作为?)。这里的推荐做法是什么?

5 个答案:

答案 0 :(得分:32)

时间是一个单一的东西。时间戳加时区是二维的,描述时间点和位置。 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"

答案 1 :(得分:6)

如果您只是使用Map的Map侧面减少,那么这些建议可能就好了。但是,如果你想减少结果(_count,_stats,_sum),那么我建议你把日期作为数组发送,这样你就可以使用group_level。

例如,如果您在格式为“2011-02-14”的日期字符串上发出(doc.date.split(' - ')),那么您可以每天,每月和每月返回_count(例如)年份分别使用group_level = 3,2和1。

您可以通过将非日期数据添加到密钥的开头来进一步过滤数据。例如,如果您输出Twitter名称,您的密钥可能看起来像[“bigbluehat”,“2011”,“02”,“14”],并且您的reduce可以返回用户“bigbluehat”的所有推文的总数以及该日期,月份和年份的用户统计信息。

如果你没有使用减少方面的东西,那么基于字符串的密钥很可能。

答案 2 :(得分:5)

无论我使用什么类型的数据存储,我通常都希望在那里使用unix时间戳作为字段,其中我将为创建的日期包含一个,然后在文档更改时我可以更改一个更新的字段

我更喜欢常规的“自纪元以来的秒”而不是“自纪元以来的毫秒”只是为了简单。

Math.round(new Date().getTime()/1000)为我做了诀窍。

就可读性而言,我希望将其存储为整数以便于比较,并使用前端来很好地显示它。

答案 3 :(得分:4)

您可以根据需要存储日期*,这是将它们输出到您认为重要的视图中的方式。

*只要Date.parse()可以读取它。

这里有一个很好的解决方案:Sorting Dates in CouchDB Views

答案 4 :(得分:4)

我喜欢使用自上一纪元以来的毫秒数。您可以通过以下方式解决这个问题:

new Date().valueOf()

您可以使用以下命令从毫秒创建新日期:

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

我喜欢创建一个视图,其中时间戳(以毫秒为单位)是关键的b / c排序非常简单。

另外,我认为使用整数比字符串更有效,至少在处理CouchDB之外的数据时是这样。