1

私はこの文書を持っています:

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

私の現地時間は GMT+7 なので、上記の日付は私の現地時間で 2015-08-09 6:41:23 です。このクエリを以下に送信し、上記のドキュメントを受信したい

{
   date: '2015-08-09',
   offset: '+7'
}

AQL でそれを達成するための最良の方法は何ですか?

4

2 に答える 2

1

タイムゾーン GMT+7 の現地時間が の場合2015-08-09 6:41:23、JavaScript コードはその瞬間new Date().toISOString()に戻ります。"2015-08-08T23:41:23.000Z"ご覧のとおり、UTC 時間を返します。もちろん、コンピューターには正しい日付、時刻、タイムゾーンが設定されている必要があります。

過去または未来の日付を照会する必要があり、その日付が現地時間である場合は、タイムゾーン オフセットを指定して ISO8601 文字列を作成できます。2011-01-01 2:00:00UTC 時間で GMT+7 が何であるかを知りたいとしましょう:

// 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)

少なくとも Firefox では、DST の開始日時または終了日時をまたがっても、これは確実に機能するようです。ただし、Chrome にはバグがあり、日付の計算が完全にずれていました: https://code.google.com/p/v8/issues/detail?id=3116

于 2015-08-13T10:49:16.603 に答える