2009-08-12 2 views
3

오랫동안이 날짜 문제에 직면 해 왔습니다. 많은 것을 시도했지만 헛된. 문제는 다음과 같습니다 :다른 시간대에있는 MySQL의 날짜 문제

사용자가 입력 한 날짜는 '2009-08-12'입니다. DB에 제대로 저장됩니다.

GMT + 530 시간대에서는 날짜가 올바르게 표시됩니다. 그러나 시간대를 GMT + 1로 변경하면 날짜가 '2009-08-11'로 표시됩니다. 즉, 1 일 전으로 날짜가 표시됩니다.

도움이나 의견이 있으면 도움이 될 것입니다.

감사

네이트

답변

5

날짜는 아마 DATETIME 또는 TIMESTAMP로 저장, 2009-08-12 00:00:00 +0530

GMT+1로 변환되는, 그것은 당신에게 제공 2009-08-11 19:30:00 +0100

MySQLDATETIME 저장하지 않습니다 시간대와 함께 시간대를 입력하십시오. 따라서 유형이 DATETIME 인 경우 그럴 가능성이 있습니다. y 날짜를 변환하는 데이터베이스 액세스 계층.

MySQL 유형은 UTC에 시간을 저장하고 쿼리 할 때 클라이언트의 시간대로 다시 변환됩니다. 등

내 조언는 것, java.sql.PreparedStatement.setDate(int, Date, Calendar), java.sql.ResultSet.getDate(int, Calendar) 같은 방법 -

1

@Quassnoi이 일어나고있는 이유를 설명했지만, 그것을 해결하는 방법은 여러 가지 일정 매개 변수를 사용 java.sql.PreparedStatementjava.sql.ResultSet 메소드를 사용하는 것입니다 데이터베이스에서 날짜를 나타내는 데 사용되는 표준 시간대 (일반적으로 UTC)를 선택한 다음 위에서 언급 한 방법을 사용하여 변환을 수행하십시오.

물론 데이터베이스와 동일한 시간대에서 클라이언트를 표준화 할 수 있고 더 나은 데이터베이스와 표준 시간대를 염두에 두지 않고 데이터 비교를 수행 할 수 있다면 날짜가 표시 될 때 모든 변환을 수행 할 수 있습니다.

3

이 문제는 매우 광범위하게 나타납니다. 예를 들어, 여기에 Martin Fowler의 설명이 있습니다.

근본적인 문제는 Java의 날짜 클래스가 물리학의 수량과 같은 날짜/시간을 처리한다는 것입니다. 즉, 특정 불변의 순간을 나타냅니다.

문제는 대부분의 사람들이 시간에 대해 부담없이 생각하는 방식과 일치하지 않는다는 것입니다. 전형적인 담론에서 사람들은 '2009-08-01 18:00'을 고정 관념으로 생각합니다. 문제는 그런 표 현에 첨부 된 시간대가 없다는 것입니다. 따라서 실제로 특정 순간을 나타내지는 않습니다.

이것은 많은 응용 프로그램에서 계속되는 혼란의 원인입니다. Java는 항상 암시 적 또는 명시 적으로 시간대를 사용하지만 데이터베이스는 일반적으로 날짜/시간과 함께 표준 시간대 정보를 저장하지 않습니다. 따라서 Java는 Date 객체를 만들 때 가정 된 시간대를 추가해야합니다. 이것은 값을 Date 객체로 변환 할 때 JDBC 드라이버에 의해 수행됩니다. 이러한 코드가 서버에서 실행되면 가정 된 시간대는 종종 클라이언트/최종 사용자가 사용하는 시간대와 일치하지 않습니다.

유일한 대답은 Java 코드가 '표준'시간대를 사용하는지 확인하는 것입니다.

0

cron 표현식을 사용하여 석영과 비슷한 문제가 발생하고 예정된 작업이 잘못된 시간 값으로 저장되었습니다. 응용 프로그램이 로컬 타임 존 값으로 호스팅되는 서버 시간대를 조정하면 문제가 해결되었습니다.