2

私はpg-promise lib を使用して Postgres DB を操作しています。DBを直接クエリする理由がわかりません

SELECT date FROM ro WHERE id = 13;

戻り値

date          
------------------------
 2017-01-19 00:00:00+02
(1 row)

そして、この pgp 呼び出し:

var sql = 'SELECT date from ro WHERE id = 1366';
    Dbh.odb.any(sql)
      .then(ro => {
        console.log(ro);
        res.ok(ro)
      })

戻り値

{
    "date": "2017-01-18T22:00:00.000Z"
}

私が期待しているのは

{
   "date": "2017-01-19T00:00:00.000Z"
}
4

2 に答える 2

3

psqlpg-promise を実行しているのと同じマシンで実行していますか?

ドキュメントからtimestamp with timezone

タイム ゾーン付きタイムスタンプの場合、内部に保存される値は常に UTC (Universal Coordinated Time、グリニッジ標準時 (GMT) として知られています) です。明示的なタイム ゾーンが指定されている入力値は、そのタイム ゾーンの適切なオフセットを使用して UTC に変換されます。入力文字列にタイム ゾーンが指定されていない場合は、システムのTimeZone パラメータで指定されたタイム ゾーンにあると見なされ、タイム ゾーンのオフセットを使用して UTC に変換されます。

タイムゾーン値を含むタイムスタンプが出力される場合、常に UTC から現在のタイムゾーン ゾーンに変換され、そのゾーンの現地時間として表示されます。別のタイムゾーンで時刻を表示するには、タイムゾーンを変更するか、AT TIME ZONE構文を使用します (セクション 9.9.3 を参照)。

TimeZoneそのため、タイムゾーンは UTC で保存され、そのドキュメントからパラメーターに基づいて取得されます (わずかにクリーンアップされています)。

TimeZone構成パラメータを設定できます。

  1. ファイルpostgresql.confで
  2. 第 19 章で説明されているその他の標準的な方法のいずれかで。
  3. SQL コマンド SET TIME ZONE は、セッションのタイム ゾーンを設定します。これは、より SQL 仕様と互換性のある構文を使用した SET TIMEZONE TO の代替スペルです。
  4. PGTZ 環境変数は、libpq クライアントが接続時に SET TIME ZONE コマンドをサーバーに送信するために使用されます。

だから、いつでも、

var sql = `SELECT date AT TIME ZONE '+02' from ro WHERE id = 1366`;
    Dbh.odb.any(sql)
      .then(ro => {
        console.log(ro);
        res.ok(ro)
      })

または、クライアント、セッション、またはサーバーのタイムゾーンを設定します。

timezoneここで潜在的な値を見つけることができます

SELECT * FROM pg_timezone_names();
于 2017-01-12T20:41:32.917 に答える
2

psql出力は、タイムスタンプが真夜中であることを示していますが、UTCより 2 時間進んでいる UTC+2 タイムゾーン (2017-01-19 00:00:00+ 02 )です

つまり、時刻が UTC+2 で 00:00:00 の場合、UTC で前日の 22:00:00 にすぎませ

その UTC 日付から JavaScript 日付を作成すると、UTC+2 を使用している場合は午前 0 時になります。これは、UTC + 2 の Chrome コンソールに表示されるものです。

new Date('2017-01-18T22:00:00.000Z');
Thu Jan 19 2017 00:00:00 GMT+0200 (EET)

また、タイムスタンプを真夜中の UTC として保存したい場合は、日付を挿入するときにタイムゾーンを定義する必要があります。ただし、UTC+2 の午前 0 時ではないことに注意してください。

new Date('2017-01-19T00:00:00.000Z');
Thu Jan 19 2017 02:00:00 GMT+0200 (EET)
于 2017-01-12T20:53:10.153 に答える