Arangodb AQL中带偏移量的查询日期

Arangodb AQL中带偏移量的查询日期,arangodb,aql,Arangodb,Aql,我有以下文件: { paymentDate: '2015-08-08T23:41:23.909Z' } 我的当地时间是GMT+7,因此上面的日期是我当地时间的2015-08-09 6:41:23。 我想在下面发送此查询,并接收上面的文档 { date: '2015-08-09', offset: '+7' } 在AQL中实现这一点的最佳方法是什么?可以这样理解,ArangoDBs原生格式JSON不知道特殊的日期格式,因此建议将日期存储为字符串。 最佳做法是将UTC存储在数据

我有以下文件:

{
   paymentDate: '2015-08-08T23:41:23.909Z'
}
我的当地时间是GMT+7,因此上面的日期是我当地时间的2015-08-09 6:41:23。 我想在下面发送此查询,并接收上面的文档

{
   date: '2015-08-09',
   offset: '+7'
}
在AQL中实现这一点的最佳方法是什么?

可以这样理解,ArangoDBs原生格式JSON不知道特殊的日期格式,因此建议将日期存储为字符串。 最佳做法是将UTC存储在数据库中,并将其转换为应用程序中的用户时区

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

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" 
  } 
]
arangosh>db.\u创建(“示例时间”);
[ArangoCollection 729616498254,“exampleTime”(类型文档,状态已加载)]
arangosh>var时间戳=[“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.\u查询(“例如,时间过滤器d.ts>'2014-05-07T14:19:09.522'和d.ts<'2014-05-08T18:19:09.522'返回d”)。toArray()
[ 
{ 
“价值”:2,
“ts”:“2014-05-08T04:19:09.522”,
“_id”:“exampleTime/729617284686”,
“_rev”:“729617284686”,
_键:“729617284686”
}, 
{ 
“价值”:1,
“ts”:“2014-05-07T21:19:09.522”,
“_id”:“exampleTime/729617088078”,
“_rev”:“729617088078”,
_键:“729617088078”
}, 
{ 
“价值”:3,
“ts”:“2014-05-08T11:19:09.522”,
“_id”:“exampleTime/729617481294”,
“_rev”:“729617481294”,
_键:“729617481294”
} 
]

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

如果要查询过去或将来的日期,且该日期为本地时间,则可以使用指定的时区偏移量构造ISO8601字符串。假设我们想知道格林尼治标准时间+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"
如果您已经有一个没有时区偏移量的datetime字符串(
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"
//编辑 这似乎也行得通:

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

即使您跨越DST的开始或结束日期时间,至少在Firefox中,这似乎也能可靠地工作。然而,Chrome中存在一个错误,导致计算完全脱离日期:

谢谢,我确实将日期存储在UTC+0中(日期后面的Z是zulu/UTC+0),但是否有其他方法可以过滤而不修改查询日期。我的意思是这样的:`。。。筛选日期添加(d.ts,7)>“2014-05-07”…`。不,这目前不可能。你必须在客户机中这样做。
var d = new Date("2015-08-09T06:41:23Z")
d.setHours(d.getHours() - 7)