2012-07-26 5 views
2

우리는 UTC 타임 스탬프가 DATETIME 컬럼에 유지되는 MySQL 데이터베이스를 가지고있다.Hibernate와 MySQL : UTC datetime

나는 (TemporalType.TIMESTAMP와, 날짜 속성에) 최대 절전 모드를 통해이 시간을 검색하고 변경되지 않은 사용자에게 표시 할하고있다.

내가보고하고 문제는 Hibernate가 열 값을 읽을 때, 그 객체의 날짜 속성에 시간대 (초 시대에서) 값을 할당한다는 것입니다. 그러나이 값은 현지 표준 시간대에 저장됩니다. 내가 영국에서 오전

2012-05-24T15:00:00.000+0100 

, 그래서 0100 (GMT + DST)이이 : 최대 절전 모드 내에서 "datetest"개체를로드하고 "MyDate가"값을 볼 수

mysql> create table datetest(mydate datetime); 
Query OK, 0 rows affected (0.13 sec) 

mysql> insert into datetest values('2012-07-25 16:00:00'); 
Query OK, 1 row affected (0.00 sec) 

mysql> select mydate from datetest; 
+---------------------+ 
| mydate    | 
+---------------------+ 
| 2012-07-25 16:00:00 | 
+---------------------+ 
1 row in set (0.00 sec) 

은 값을 보여줍니다 현지 시간대.

mysql> select unix_timestamp(mydate) from datetest; 
+------------------------+ 
| unix_timestamp(mydate) | 
+------------------------+ 
|    1343228400 | 
+------------------------+ 
1 row in set (0.00 sec) 

내가 Hibernate는이 UNIX_TIMESTAMP을 사용하는 기록을로드 할 때() 객체의 날짜 속성을 채우는 것을 가정 :이 UNIX_TIMESTAMP() 결과와 일치합니다. UNIX_TIMESTAMP()에 대한 문서 상태 :

서버는 현재 시간대의 값으로 날짜를 해석하고 내가를 변경하는 제어 할 수 없습니다

UTC의 내부 값으로 변환 서버의 시간대가 세계적으로 설정되어 있고 데이터베이스에 변경되지 않아야하는 다른 많은 시간대 관련 열이 있습니다. 그렇다면 어떻게 Hibernate에게 단지 몇몇 컬럼 값이 UTC인지와 그것들에 어떤 'timezone'포맷팅도 적용하지 않도록 보장 할 수 있을까? MySQL의 명령 행 클라이언트 내에서

나는

SET TIME_ZONE='+0:00' 

를 사용하여 로컬 시간대를 변경할 수 있습니다 그리고 이것은 UNIX_TIMESTAMP 수()는 UTC 값을 반환합니다,하지만 난 전에이 값을 보내도록 Hibernate에게 알려 방법을 작동하지 않을 수 있습니다 데이터베이스에서 정보를 추출하는 기준/투영을 실행합니다.

답변

0

A Java Timestamp에는 시간대가 없습니다. 표시되는 표준 시간대는 현지 표준 시간대로 Timestamp 인스턴스를 읽을 수있는 문자열로 변환하는 메서드로 표시됩니다 (사용자가 질문하지 않은 경우). 그리고 귀하의 편의를 위해,이 방법은 귀하의 지역 시간대를 사용하는 것으로 보이기 때문에 귀하가 표시 한 시간과 벽시계로 표시된 시간을 쉽게 비교할 수 있습니다.

다른 표준 시간대를 사용하여 Timestamp 인스턴스를 다른 방식으로 포맷하려면 SimpleDateFormat을 사용하십시오.

+0

내가 볼, 그래서 시간대 내가 디버깅있을 때보다 다른 정말 관련이 없습니다와 toString() 또는 이와 유사한 다시 추가합니다? 중요한 것은 생성 된 타임 스탬프가 UTC 기반이며 MySQL이 로컬 변환하지 않았는지 확인하는 것입니다. 최대 절전 모드 쿼리 바로 전에 SET TIME_ZONE = '+ 0:00'SQL 쿼리를 보내려고했으나 차이가 발생하지 않았습니다 .. – jdp80

+0

예. 타임 스탬프를 표시하는 데 어떤 방법을 사용하고 있는지 알 수는 없지만 시간대는 지정하지 않습니다. –

관련 문제