2017-02-15 2 views
2

GMT + 1 시간대에 있고 long 변수에 UTC 시간 소인 (11:12:56)이 있습니다.UTC 타임 스탬프 -> java.sql.Timestamp -> jOOQ -> 로컬 타임 스탬프 in postgreSQL?

long ts = 1487157176450; 

이 타임 스탬프에서 java.sql.Timestamp을 초기화합니다.

Timestamp timestamp = new Timestamp(ts); 

그런 다음이 시간 기록을 jOOQ를 사용하여 PostgreSQL (v9.4) 데이터베이스에 삽입합니다.

create.insertInto(TABLE, 
    TABLE.NAME, TABLE.TS) 
    .values("Foo bar", timestamp); 

그러나, 나는 실제 SQL 명령을 실행 로그인 한 경우,이 보았다

< 2017-02-15 10:50:37.326 CET >LOG: execute <unnamed>: insert into "database"."table" ("name", "ts") values ($1, cast($2 as timestamp)) 
< 2017-02-15 10:50:37.326 CET >DETAIL: parameters: $1 = 'Foo bar', $2 = '2017-02-15 12:12:56.450' 

내가 타임 스탬프가 로컬 하나에 설정 되었나요 어디 완전히 잘 모르겠지만,을하지 않는 한 pgAdmin 거짓말, 나는 실제로 내가 원하는 UTC 대신 데이터베이스에 GMT + 1 타임 스탬프를 저장합니다.

이제 JDBC를 사용하지 않으므로 연결된 질문에 대한 대답은 도움이되지 않습니다. jOOQ가 올바른 타임 스탬프를 저장하도록하려면 어떻게해야합니까?

+0

클라이언트에 대해 시간대를 UTC로 설정하거나 캐스트를 명시 적으로 사용할 수 있습니다. –

+0

JDBC 사양에서는 1) 명시 적으로 지정하지 않는 한 JVM 기본 시간대에서 타임 스탬프를 보내야합니다. 올바른 시간대로'Calendar '를 전달하고, 2) 특정 시간대가있는 열에 삽입하고, 3)'java.time.OffsetDateTime'을 사용합니다. –

답변

1

타임 스탬프 클래스 자체는 시간대에 대해 을 알지 못합니다..

즉, 들어오는 값이 UTC라고 가정합니다.

그러나 타임 스탬프가 추가로 처리되고 특별히 설정되는 것이 없으면 Timestamp 개체에서 "가져 와서"데이터베이스에 푸시 된 값은 현재의 로캘을 고려합니다.

너는 더 생각을 위해 here을 볼 수있다. Mikael Valot의 대답은 시간대와 관련하여 long 값을 TimeStamp 생성자에 전달하는 방법을 몇 가지 예제로 보여줍니다.

+0

맞아요, 그래서 어떻게하면 jOOQ를 말할 수 있습니까? 타임 스탬프를 현재 로케일로 변환 하시겠습니까? –

+0

@ TomášM. https://blog.jooq.org/tag/time-zones/ 및 http://stackoverflow.com/questions/27913735/jooq-timestamp-being-stored-with-local-timezone-offset –

+1

@ TomášM을 참조하십시오. : jooq (JDBC에 'Timestamp'를 전달하는 것)와 관련이 없지만 JDBC/PostgreSQL 문제가 있습니다. PostgreSQL 데이터 타입으로'timestamp with timezone'을 사용하고,'java.time.OffsetDateTime'에 이것을 매핑하기 위해 올바른 데이터 타입 바인딩을 jOOQ에 적용 할 것입니다. –