2016-11-01 20 views
2

ヨーロッパ(GMT + 1)とフロントエンドJavaScriptアプリケーションで今日30-NOV-2016が00:00:00と言いましょう。JSON.stringify(new Date(2016, 11-1, 30)) JSON(文字列) Oracleのバックエンドへの日付。JSON日付を現地時間でのOracle日付に変換する方法

この日付は、文字列"2016-11-29T23:00:00.000Z"として到着し、この文字列を(再度)ローカルタイムゾーン(GMT + 1)の適切なOracle DATEに変換したいと思います。

私はトリックを行うために

SELECT CAST(TO_TIMESTAMP_TZ('2016-11-29T23:00:00.000Z', 'FXYYYY-MM-DD"T"HH24:MI:SS.FXFF3"Z"') AT LOCAL AS DATE) FROM DUAL; 

を期待したが、これは実際に私のUTC日付29.11.2016 23:00:00なく正しいローカルの日付30.11.2016 00:00:00を返します。

これはかなり簡単なはずですが、私が間違っていることはわかりません。

答えて

1

to_timestamp_tz()を使用しても、実際にタイムゾーンを指定していない場合は、デフォルトでシステムのタイムゾーンに設定されます。これはおそらくUTCではありません。したがって、生成しているタイムゾーンのタイムスタンプはすでにローカルシステムのタイムゾーンにあるため、at localは何もしていません。

代わりにプレーンタイムスタンプに変換し、タイムゾーンをthe from_tz() functionでUTCとして宣言できます。その後、まだあなたのローカルタイムゾーンに変更するthe AT LOCAL expressionを使用します。

alter session set time_zone = 'Europe/Vienna'; 

SELECT CAST(
    FROM_TZ(TO_TIMESTAMP('2016-11-29T23:00:00.000Z', 'FXYYYY-MM-DD"T"HH24:MI:SS.FXFF3"Z"'), 
    'UTC') AT LOCAL AS DATE) FROM DUAL; 

CAST(FROM_TZ(TO_TIM 
------------------- 
2016-11-30 00:00:00 

ビットをそのを破壊:

  1. TO_TIMESTAMP('2016-11-29T23:00:00.000Z', 'FXYYYY-MM-DD"T"HH24:MI:SS.FXFF3"Z"')は、タイムゾーン情報と、平野TIMESTAMP値にあなたの文字列値に変換します。
  2. FROM_TZ(..., 'UTC')プレーンtimestamp UTCなどの時間帯部分とtime stamp with time zoneへの変換 - 何ら調整が日付/時刻要素のいずれかに行われていない、それだけで、それらは、UTC値を表す状態。
  3. ... AT LOCALは、セッションのタイムゾーン(システムのタイムゾーンと同じでない可能性があります)に変換されます。
  4. CAST(... AS DATE)は、ローカルタイムゾーンの値をdateに変換します。再び要素の値は調整されませんが、小数点以下の秒とタイムゾーンの情報は失われます。

またto_timestamp_tz()に固執したがUTCコード含めることができます

SELECT CAST(
    TO_TIMESTAMP_TZ('2016-11-29T23:00:00.000Z' || 'UTC', 
    'FXYYYY-MM-DD"T"HH24:MI:SS.FXFF3"Z"TZR') 
    AT LOCAL AS DATE) FROM DUAL; 

またはUTCとZを置き換える:これらのすべてが前提と

SELECT CAST(
    TO_TIMESTAMP_TZ(REPLACE('2016-11-29T23:00:00.000Z', 'Z', 'UTC'), 
    'FXYYYY-MM-DD"T"HH24:MI:SS.FXFF3TZR') 
    AT LOCAL AS DATE) FROM DUAL; 

を - 正確に、私は信じている - ことJSON文字列は常にUTCになり、Zはそこにあるとみなされ、そのことを意味することができます(もちろんas it should do)。

+0

Z(「ズールー時間」とも呼ばれます)は、[この質問に対する回答]として、UTCを表します(http://stackoverflow.com/questions/9706688/what-does-the-z-mean-in-unix-タイムスタンプ-120314170138z)。私はタイムゾーンに関連する質問で最後に絡み合ったときにそれを見つけました。それは私のための "oooooohhhh"の瞬間だった! * {:-) – Boneist

+0

はい、私はそれが実際にはUTCではない値に自動的に追いついているのを見ました。それはここでは問題ではないようですが、自分自身をカバーしています... –

+0

それは...悪です!非常によく知られていることではないと思います。 – Boneist

関連する問題