2016-11-01 2 views
2

유럽 (GMT + 1) 및 프론트 엔드 JavaScript 응용 프로그램의 경우 30-NOV-2016은 00:00:00이라고 가정 해 봅시다. JSON.stringify(new Date(2016, 11-1, 30)) JSON (문자열) 날짜를 오라클 백엔드로 보냅니다.JSON 날짜를 현지 시간으로 Oracle 날짜로 변환하는 방법

이 날짜는 "2016-11-29T23:00:00.000Z" 문자열로 표시되고이 문자열을 (다시) 현지 시간대 (GMT + 1)의 적절한 Oracle 날짜로 변환하고 싶습니다.

나는 트릭을 할
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')은 해당 시간대를 UTC로 사용하여 time stamp with time zone으로 timestamp을 변환합니다. 날짜/시간 요소를 조정하지 않으면 UTC 값을 나타냅니다.
  3. ... AT LOCAL
  4. 는 (당신의 시스템 타임 존과 동일하지 않을 수 있음) 세션의 시간대로 변환합니다.
  5. CAST(... AS DATE)
  6. 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- timestamp-120314170138z). 나는 타임 존과 관련된 질문에서 마지막으로 얽힌 시간을 보았습니다. 그것은 나를위한 "oooooohhhh"순간이었다! * {:-) – Boneist

+0

네,하지만 실제로는 UTC가 아닌 값을 자동으로 추가하는 것으로 나타났습니다. 그건 여기에 문제가되는 것 같지 않고 단지 자신을 덮고있는 것 같습니다 ... –

+0

그 악마가 될 것입니다!매우 잘 알려진 일이 아닐 것 같습니다. – Boneist

관련 문제