web-dev-qa-db-ja.com

JSONBがJavaScriptとは異なる日付形式を表示するのはなぜですか?

JavaScriptの.toISOString();.toJSON()を使用すると、

(new Date()).toISOString();
2018-01-30T12:04:13.153Z

日付を返すときにPostgreSQLを使用すると、

# SELECT to_jsonb('2018-01-30T12:04:13.153Z'::timestamp with time zone);
            to_jsonb             
---------------------------------
 "2018-01-30T06:04:13.153-06:00"
(1 row)

これらの2つの形式が異なるのはなぜですか?

1
Vincent Vost

ECMA-262 v6では、Zが_.toISOString_の結果に含まれている必要があります。タイムゾーンが指定されている場合、ミリ秒の精度は必要ありません。一方、JavaScriptにはそもそも日付タイプがありません。これらの形式は両方とも ISO 8601 です。 PostgreSQLはZを指定せず、指定された精度のみを提供します。それを妨げるものは何もない。

Date()コンストラクターはgladly両方の形式を受け入れ、JavaScriptで必要なすべての日時に Moment.jsを使用する必要があります。 = PostgreSQLの出力で日付オブジェクトをすぐに構築する必要があります。 JSONはISO 8601の日付/時刻オブジェクトとの違いがわからないので、これはあなたのためになされないかもしれません。その時点から、それはPostgreSQLの手に負えません。 PostgreSQLが保証していることは、出力が有効なJavaScript Date()入力であることだけです。これは、JSON仕様でさえも必要とされていないためです。

ECMA-262 v6仕様、

ECMA-262 v6仕様 は、

Date.prototype.toISOString()この関数は、この時間値に対応する時間内のインスタンスを表す文字列値を返します。文字列の形式は、20.3.1.16で定義された日時文字列形式です。すべてのフィールドが文字列に存在します。時間帯は常にUTCであり、サフィックスZ **で示されます。この時刻の値が有限数でない場合、または年がその形式で表現できる値でない場合(必要に応じて拡張年形式を使用)、RangeError例外がスローされます。

つまり、これは、

Zは、 "Z"(UTCの場合)または "+"または "-"の後に時間式が続く_HH:mm_として指定されたタイムゾーンオフセットです。

この形式には、日付のみのフォームが含まれます。

_YYYY
YYYY-MM
YYYY-MM-DD
_

また、上記の日付のみのフォームの1つと、その後に続くオプションのタイムゾーンオフセットが付加された次のいずれかのタイムフォームのいずれかで構成される「日時」フォームも含まれます。

_THH:mm
THH:mm:ss
THH:mm:ss.sss
_

JSON仕様

JSON仕様は 日付のフォーマット について何も述べていません。実際、言及されている日付タイプすらありません。これはおそらく、JavaScriptの日付が プリミティブではないオブジェクト であるためです。

PostgreSQL

PostgreSQLは、コンストラクタに提供された最小精度のみを出力し、zは出力しません(ISO 8601のままです)。

_SELECT to_jsonb(dt::timestamp with time zone)
FROM ( VALUES
  ('2018-02-01T13:24:36.466849-06:00'),
  ('2018-02-01T13:24:36-06:00');
_
3
Evan Carroll