查询日期与AQL中的偏移量

时间:2015-08-09 00:04:58

标签: arangodb aql

我有这个文件:

containerView

我当地时间是格林尼治标准时间+7因此上述日期是当地时间2015-08-09 6:41:23。 我想在下面发送此查询,并收到上面的文档

{
   paymentDate: '2015-08-08T23:41:23.909Z'
}

在AQL中实现这一目标的最佳方法是什么?

2 个答案:

答案 0 :(得分:1)

可以在the documentation about dates中读取,ArangoDBs本机格式JSON不知道特殊的日期格式,因此建议将日期存储为字符串。 最佳做法是将UTC存储在数据库中,并将其转换为应用程序中的用户时区。

因此,查询将使用FILTER和字符串比较来选择范围:

arangosh> db._create("exampleTime");
[ArangoCollection 729616498254, "exampleTime" (type document, status loaded)]
arangosh> var timestamps = ["2014-05-07T14:19:09.522","2014-05-07T21:19:09.522","2014-05-08T04:19:09.522","2014-05-08T11:19:09.522","2014-05-08T18:19:09.522"];
arangosh> for (i = 0; i < 5; i++) db.exampleTime.save({value:i, ts: timestamps[i]})
arangosh> db._query("FOR d IN exampleTime FILTER d.ts > '2014-05-07T14:19:09.522' and d.ts < '2014-05-08T18:19:09.522' RETURN d").toArray()
[ 
  { 
    "value" : 2, 
    "ts" : "2014-05-08T04:19:09.522", 
    "_id" : "exampleTime/729617284686", 
    "_rev" : "729617284686", 
    "_key" : "729617284686" 
  }, 
  { 
    "value" : 1, 
    "ts" : "2014-05-07T21:19:09.522", 
    "_id" : "exampleTime/729617088078", 
    "_rev" : "729617088078", 
    "_key" : "729617088078" 
  }, 
  { 
    "value" : 3, 
    "ts" : "2014-05-08T11:19:09.522", 
    "_id" : "exampleTime/729617481294", 
    "_rev" : "729617481294", 
    "_key" : "729617481294" 
  } 
]

答案 1 :(得分:1)

如果您在GMT + 7时区的当地时间是2015-08-09 6:41:23,那么JavaScript代码new Date().toISOString()将在那一刻返回"2015-08-08T23:41:23.000Z"。如您所见,它返回UTC时间。您的计算机当然需要配置正确的日期,时间和时区。

如果要查询过去或将来的日期,并且该日期是本地时间,则可以构造一个ISO8601字符串,并指定时区偏移量。我们想说我们想知道GMT + 7中的2011-01-01 2:00:00在UTC时间内是什么:

// timezone offset: 07 hours, 00 minutes (+0700)
new Date("2011-01-01T02:00:00+0700").toISOString()
// result: "2010-12-31T19:00:00.000Z"

在AQL中也是如此:

RETURN DATE_ISO8601("2011-01-01T02:00:00+0700")
// result: "2010-12-31T19:00:00.000Z"

如果您已经有一个没有时区偏移(2011-01-01T02:00:00)的日期时间字符串,但想假设它是您当地的时间,您可以在JS中执行以下操作来附加时区偏移量:

// Should return -420 for your timezone GMT+7.
// You can supply an offset in minutes manually as well of course.
var offset = new Date().getTimezoneOffset()

var offsetHours = offset / 60 | 0
var offsetMinutes = Math.abs(offset % 60)

var offsetStr = ((offsetHours < 0) ? "+" : "-") + // GMT + or -?
    ((Math.abs(offsetHours) < 10) ? "0" : "") + // leading zero for single digit
    Math.abs(offsetHours) + // hour portion
    ((offsetMinutes < 10) ? "0" : "") + // leading zero for single digit
    offsetMinutes // minute portion

var dateStr = "2011-01-01T02:00:00" + offsetStr
console.log(dateStr)
console.log(new Date(dateStr).toISOString())
// on a GMT+7 machine, result should be:
// "2011-01-01T02:00:00+0700"
// "2010-12-31T19:00:00.000Z"

如果日期字符串是在当地时间,但是以某种方式添加了Zulu时区偏移量,您可以将其更正为7小时,如下所示:

// It should had been +0700 and not +0000
var d = new Date("2015-08-09T06:41:23Z").getTime() - 7 * 60 * 60 * 1000
// result: 1439077283000, which is 2015-08-08T23:41:23.000Z

// or in a really hacky way:
new Date("2015-08-09T06:41:23Z".replace("Z", "+0700"))

<强> //修改 这似乎也有效:

var d = new Date("2015-08-09T06:41:23Z")
d.setHours(d.getHours() - 7)

即使您越过DST的开始日期或结束日期时间,这似乎也能可靠地工作,至少在Firefox中是这样。但Chrome中存在一个错误,导致完全关闭日期计算:https://code.google.com/p/v8/issues/detail?id=3116