CouchDB按月和年过滤UTC日期

时间:2013-09-11 14:11:08

标签: javascript date couchdb

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

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

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

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

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

2 个答案:

答案 0 :(得分: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

由于我们已将 next 月的开始作为结束日期传递,因此请确保执行独占<而不是包含<=操作。只有开始日期应该是包容性的。

答案 1 :(得分: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(没有时间偏移)。