1

我为我的一个 Couch 数据库中的每个文档保存了一个 UTC 时间戳。我想根据一年中的特定月份查询和过滤这些文档。为此,我创建了一个具有以下地图功能的视图:

function(doc) {
    var date = new Date(doc.activity.date);
    emit([doc.user, date.getUTCMonth(), date.getUTCFullYear()], doc.activity.distance);
}

例如,我查询此视图:?key=["1edd367d08770ea34586dbe6dc03ea2c",3,2013],只要 UTC 和本地时间在同一个月内,它就可以正常工作。

我要问的是如何确保这样的查询返回一个月的所有文档,其中月份由客户本地时间而不是 UTC 定义?

客户端是基于 JavaScript 的 Web 客户端,但查询是通过后端的 NodeJS API 处理的。

4

2 回答 2

2

我要问的是如何确保这样的查询返回一个月的所有文档,其中月份由客户本地时间而不是 UTC 定义?

查找客户月份的开始时间和客户下个月的开始时间。这些将形成要查询的范围。例如:

var now = new Date();
var start = new Date(now.getFullYear(), now.getMonth(), 1);
var end = new Date(now.getFullYear(), now.getMonth() + 1, 1);

然后,您需要决定将其作为 UTC 传递给数据库的最佳方式。例如:

var startUTC = start.toISOString();
var endUTC = end.toISOString();

(我不确定 CouchDB 的具体细节,因此如有必要进行调整。)

然后,您需要在数据库中进行范围查询。您不能只匹配年份和月份,因为您的数据采用 UTC 格式,并且边缘不一定与您客户的时区对齐。

我不熟悉 Couch 的语法,但在 SQL 中会是这样的:

... WHERE activityDate >= startUTC AND activityDate < endUTC

由于我们将下个月的开始作为结束日期,因此请确保执行独占操作<而不是包含<=操作。只有开始日期应该包含在内。

于 2013-09-11T15:32:57.390 回答
0

我要问的是如何确保这样的查询返回一个月的所有文档,其中月份由客户本地时间而不是 UTC 定义?

如果客户发送他的本地时间,他必须参考他所在的时区。否则,他必须使用 UTC 或 GMT。

如果不包括时区,您基本上必须检测客户端所在的时区并做出无法解决的假设(例如,位于意大利 IP 上的笔记本电脑可能设置为美国时间)。

见:http ://en.wikipedia.org/wiki/ISO_8601#Time_zone_designators

ISO 8601 格式具有时区指示符,允许客户端发送他们的本地时间,但附带时间偏移。

Couchdb 支持这种 ISO 8601 格式:

剩下的就是让您将您的转换/比较等转换为 UTC/Unix 时间/等...任何适合您的格式,以便能够将 KEY 与 DATA 进行比较。

要点是您比较转换为相同时间偏移或 UTC(无时间偏移)的日期时间。

于 2013-09-11T15:15:25.057 回答