2012-09-13 6 views
4

문제 : 데이터베이스에 잘못된 시간이 있습니다. 응용 프로그램 서버에 문제가 있습니다.날짜가 올바르지 만 mysql [time zone]에 잘못되었습니다.

중국 거주 기간은 UTC + 8입니다. 최대 절전 모드입니다. 다음과 같은 엔티티 정의 (언어 : Scala)

class CargoJournal { 
    @Type(`type`="org.jadira.usertype.dateandtime.joda.PersistentLocalDateTime") 
    var deliverTime: LocalDateTime = _ 

    @Temporal(TemporalType.TIMESTAMP) 
    @Column(nullable=false) 
    var logDate:Date = _ 
} 

최대 절전 모드 로그를 열 때, 내 응용 프로그램 서버에서 다음을 참조하십시오.

mysql> select timediff(now(),convert_tz(now(),@@session.time_zone,'+00:00')); 
+----------------------------------------------------------------+ 
| timediff(now(),convert_tz(now(),@@session.time_zone,'+00:00')) | 
+----------------------------------------------------------------+ 
| 08:00:00              | 
+----------------------------------------------------------------+ 

그래서 MySQL의 시간대가 맞다 : 현재 시간은 목 9월 13일 중부 표준시 11시 08분 44초 내 데이터베이스 서버에서 2012

insert into wms_history_cargo_journal (deliver_time, log_date) 
binding parameter [1] as [TIMESTAMP] - 2012-09-13 11:08:44.25 
binding parameter [2] as [TIMESTAMP] - Thu Sep 13 11:08:44 CST 2012 

입니다. MySQL의에서 선택 후 UTC + 8

:

mysql> SELECT deliver_time, log_date FROM wms_history_cargo_journal; 
+---------------------+---------------------+ 
| deliver_time  | log_date   | 
+---------------------+---------------------+ 
| 2012-09-13 11:08:44 | 2012-09-13 03:08:44 | 
+---------------------+---------------------+ 

는 log_date 잘못입니다!

+0

왜'logDate' 필드에'@Type (type = "org.jadira.usertype.dateandtime.joda.PersistentLocalDateTime")'주석이 없습니까? 'deliverTime'이'LocalDateTime' 데이터 유형과 해당 주석으로 인해 예상대로 작동한다고 가정하지만 비슷한 매핑이 없기 때문에'logDate'가 작동하지 않습니다? –

답변

1

MySQL의 컬럼 유형은 무엇입니까? DATETIME 인 것 같습니다. 이 유형은 "순간적인 순간"을 저장하지 않으며, "시간을 시계에 저장"하므로 다른 시간대의 다른 순간을 의미 할 수 있습니다.

MySQL 드라이버가 DATETIME 열에 java.util.Date를 쓸 때 동일한 java.util.Date가 다른 시간대에서 다른 시간을 의미 할 수 있기 때문에 "시간을 시계에"씁니다. MySQL 서버 로컬 시간대와 마찬가지로 시간을 저장합니다.

DATETIME과 비슷하기 때문에 LocalDateTime에는이 문제가 없습니다. 그것은 시간을 나타내는 것이 아니라 시계를 나타내는 시간을 나타냅니다. 따라서 연/월/일 -시/분/초가 데이터베이스에 저장됩니다. 최대 절전 모드 로그에서 LocalDateTime은있는 그대로 제공되고 Date 다음에는 시간대 ("CST")가 있습니다.

일반적으로 항상 UTC로 시간을 저장하는 것이 좋으므로 Date 나 LocalDateTime이 아닌 DateTime을 사용하십시오. jadira 변환기를 사용하는 DateTime은 항상 DATETIME을 UTC로 저장/읽습니다.