자바.util.Date를 UTC/GMT 시간대 MySQL 타임스탬프 필드에 저장하는 방법은 무엇입니까?

새 Date()객체를 사용하고 MySQL DB의 필드를 묻었습니다만, 그 필드에 저장된 실제 값은 현지 시간대에 있습니다.MySQL을 UTC/GMT시간대에 보존하도록 구성하려면 어떻게 해야 합니까?연결 문자열을 구성하면 좋지만 방법을 모르겠어요.연결 문자열에는 useTimezone, serverTimzone, useGmtMillisForDatetimes, useLegacyDatetimeCode,… 같은 많은 속성이 있습니다.글쎄요, 우리가 PreparedStatement의 사용에 대해서 이야기하고 있다면 특정 시간대에 설정된 Calendar을 전송할 수 있는 setDate형식이 있습니다.예컨대 stmt라는 이름의 PreparedStatement이 있고 날짜라는 이름의 날짜가 있고 날짜가 2번째의 파라미터이다라고 가정합니다.

stmt.setDate(2, date, Calendar.getInstance(TimeZone.getTimeZone(“GMT”));

가장 좋은 점은 GMT가 잘못된 시간대 이름일지라도 get Time Zone의 기본 동작에 따라 여전히 GMT 시간대를 반환한다는 것입니다.

가장 좋은 점은 GMT가 잘못된 시간대 이름일지라도 get Time Zone의 기본 동작에 따라 여전히 GMT 시간대를 반환한다는 것입니다.

짧은 답은 다음과 같습니다. my.cnf에 “default-time-zone=utc” 추가 사용자의 날짜를 표시할 때를 제외하고 코드에서 항상 UTC로서 “생각해 주세요.JDBC에서 날짜 또는 타임스탬프를 가져오거나 설정할 때 항상 Calendar 파라미터를 사용하여 UTC로 설정합니다.resultset.getTimestamp(“my_date”, Calendar.getInstance(TimeZone.getTimeZone(“UTC”)); 서버를 NTP와 동기화하거나 데이터베이스 서버에만 의존하여 시간을 알립니다.긴 답은 다음과 같습니다.데이터베이스 및 클라이언트 코드 날짜 및 시간대를 처리할 때는 일반적으로 다음 정책을 권장합니다.서버의 로컬 시간대를 사용하는 대신 UTC timezone을 사용하도록 데이터베이스를 구성합니다(물론 UTC가 아닌 경우). 그렇게 하는 방법은 데이터베이스 서버마다 다릅니다. MySQL에 대한 지침은 http://dev.mysql.com/doc/refman/5.0/en/time-zone-support.html 에서 찾을 수 있습니다. 기본적으로 my.cnf에 이것을 작성해야 합니다. default-time-zone=utc 이렇게 하면 어디서나 데이터베이스 서버를 호스팅하고 호스팅 위치를 쉽게 변경할 수 있어 보다 일반적으로 모호함 없이 서버 날짜를 조작할 수 있습니다.현지 시간대를 사용하고 싶다면 적어도 서머타임제를 끊는 것이 좋아요. 데이터베이스 날짜가 모호해지면 악몽이 될 수 있기 때문입니다.예를 들어, 전화 통신 서비스를 구축 중이며 데이터베이스 서버에서 서머타임제를 사용하고 있는 경우 문제를 요구합니다. 2008-10-26 02:30′:00부터 ‘2008-10-26 02:35:00’까지 실제로 5분 또는 1시간 5분 동안 호출되었습니다(햇빛 절약 시간이 10월 26일 오전 3시에 발생했다고 가정)! 애플리케이션 코드 내에서 사용자에게 날짜를 표시하는 경우를 제외하고 항상 UTC 날짜를 사용하십시오.Java에서 데이터베이스에서 읽을 때는 항상 다음을 사용하십시오.타임스탬프 myDate=resultSet.getTimestamp(“my_date”, Calendar.getInstance(TimeZone.getTimeZone(“UTC”));이렇게 하지 않으면 타임스탬프가 UTC가 아닌 현지 TimeZone에 있는 것으로 간주됩니다.서버를 동기화하거나 데이터베이스 서버 시간에만 의존하십시오.어떤 서버(또는 그 이상)에 웹 서버가 있고, 다른 서버에 데이터베이스 서버가 있는 경우 해당 시계를 NTP와 동기화하는 것이 좋습니다.또는 현재 시간을 알리기 위해서 하나의 서버에만 의존하십시오. 일반적으로 데이터베이스 서버는 시간을 요구하는 것이 좋습니다. 즉, 다음과 같은 코드를 피해주세요.prepareStatement = connection.prepareStatement(“업데이트 my_table SET my_time = ? WHERE [···]”);java.util.Date now = new java.util.Date(); // 現地時間! :-(prepare Statement.setTimestamp(1, new Timestamp(now.getTime());int結果 = = ready Statement.execute(); 대신 데이터베이스 서버의 시간에 의존하십시오.prepareStatement = connection.prepareStatement(“업데이트 my_table SET my_time = NOW() WHERE [···]”);int 결과 = readyStatement.execute(); 도움이 되었으면 좋겠습니다! 🙂

짧은 답은 다음과 같습니다. my.cnf에 “default-time-zone=utc” 추가 사용자의 날짜를 표시할 때를 제외하고 코드에서 항상 UTC로서 “생각해 주세요.JDBC에서 날짜 또는 타임스탬프를 가져오거나 설정할 때 항상 Calendar 파라미터를 사용하여 UTC로 설정합니다.resultset.getTimestamp(“my_date”, Calendar.getInstance(TimeZone.getTimeZone(“UTC”)); 서버를 NTP와 동기화하거나 데이터베이스 서버에만 의존하여 시간을 알립니다.긴 답은 다음과 같습니다.데이터베이스 및 클라이언트 코드 날짜 및 시간대를 처리할 때는 일반적으로 다음 정책을 권장합니다.서버의 로컬 시간대를 사용하는 대신 UTC timezone을 사용하도록 데이터베이스를 구성합니다(물론 UTC가 아닌 경우). 그렇게 하는 방법은 데이터베이스 서버마다 다릅니다. MySQL에 대한 지침은 http://dev.mysql.com/doc/refman/5.0/en/time-zone-support.html 에서 찾을 수 있습니다. 기본적으로 my.cnf에 이것을 작성해야 합니다. default-time-zone=utc 이렇게 하면 어디서나 데이터베이스 서버를 호스팅하고 호스팅 위치를 쉽게 변경할 수 있어 보다 일반적으로 모호함 없이 서버 날짜를 조작할 수 있습니다.현지 시간대를 사용하고 싶다면 적어도 서머타임제를 끊는 것이 좋아요. 데이터베이스 날짜가 모호해지면 악몽이 될 수 있기 때문입니다.예를 들어, 전화 통신 서비스를 구축 중이며 데이터베이스 서버에서 서머타임제를 사용하고 있는 경우 문제를 요구합니다. 2008-10-26 02:30′:00부터 ‘2008-10-26 02:35:00’까지 실제로 5분 또는 1시간 5분 동안 호출되었습니다(햇빛 절약 시간이 10월 26일 오전 3시에 발생했다고 가정)! 애플리케이션 코드 내에서 사용자에게 날짜를 표시하는 경우를 제외하고 항상 UTC 날짜를 사용하십시오.Java에서 데이터베이스에서 읽을 때는 항상 다음을 사용하십시오.타임스탬프 myDate=resultSet.getTimestamp(“my_date”, Calendar.getInstance(TimeZone.getTimeZone(“UTC”));이렇게 하지 않으면 타임스탬프가 UTC가 아닌 현지 TimeZone에 있는 것으로 간주됩니다.서버를 동기화하거나 데이터베이스 서버 시간에만 의존하십시오.어떤 서버(또는 그 이상)에 웹 서버가 있고, 다른 서버에 데이터베이스 서버가 있는 경우 해당 시계를 NTP와 동기화하는 것이 좋습니다.또는 현재 시간을 알리기 위해서 하나의 서버에만 의존하십시오. 일반적으로 데이터베이스 서버는 시간을 요구하는 것이 좋습니다. 즉, 다음과 같은 코드를 피해주세요.prepareStatement = connection.prepareStatement(“업데이트 my_table SET my_time = ? WHERE [···]”);java.util.Date now = new java.util.Date(); // 現地時間! :-(prepare Statement.setTimestamp(1, new Timestamp(now.getTime());int結果 = = ready Statement.execute(); 대신 데이터베이스 서버의 시간에 의존하십시오.prepareStatement = connection.prepareStatement(“업데이트 my_table SET my_time = NOW() WHERE [···]”);int 결과 = readyStatement.execute(); 도움이 되었으면 좋겠습니다! :-)나는 같은 문제가 있어서 추적하는데 거의 하루 걸렸어요. MySQL에 DateTime열을 저장하고 있습니다. 아마존 클라우드에서 실행되는 RDS 인스턴스는 기본적으로 UTC 타임스탬프를 갖도록 올바르게 설정되어 있습니다.배기 코드는 다음과 같습니다.String startTime=”2013-02-01T04:00:00.000Z”;DateTime dt=ISODateTimeFormat.dateTimeParser(). parseDateTime(startTime);PreparedStatement stmt=connection.prepareStatement(insert발표)템플릿);타임 스탬프 ts=newTimestamp(dt.getMillis();stmt.setTimestamp(1, ts, Calendar.getInstance(TimeZone.getTimeZone(“UTC”);위 코드에서 “.setTimestamp”호출은 날짜를 UTC날짜로 사용하지 않습니다!몇시간 조사한 결과 Java/MySQL드라이버의 기존의 버그임이 밝혀졌습니다.setTimestamp에 대한 호출은 말 그대로 Calendar파라미터를 무시합니다.이 문제를 해결하려면 데이터베이스 URI에 “useLegacyDatetimeCode=false”을 추가하세요.private final static String DatabaseName = “jdbc:mysql://foo/?useLegacyDatetimeCode=false”;그러면 MySQL 데이터베이스에 저장된 날짜는 로컬 워크스테이션 시간대가 아닌 적절한 UTC 형식이었습니다.그러면 MySQL 데이터베이스에 저장된 날짜는 로컬 워크스테이션 시간대가 아닌 적절한 UTC 형식이었습니다.MiniQuark는 일반적으로 데이터베이스에 대한 몇가지 좋은 답변을 제공했습니다만 고려해야 할 MySql특정 결점이 있습니다···UTC시간대를 사용하도록 데이터베이스 구성, 실제로 문제를 해결하는 데 충분하지 않아요.OP가 요청한 대로 java.util.Date을 MySql에 넘기면 MySql운전자가 값을 변경하고 데이터베이스의 시간대에서 같은 현지 시간처럼 보이도록 하겠습니다.예:UTC로 구성되어 있는 경우는 데이터베이스.당신의 신청서는 EST입니다.5:00(EST)에 대한 java.util.Date객체를 전달합니다.데이터베이스는 5:00 UTC로 변환하고 저장합니다.터무니 없다.이 자동 조정을 “무효” 하려면 데이터를 전달하기 전에 시간을 조정해야 합니다.뭔가…이래봬도long originalTime = originalDate.getTime(); Date newDate=newDate(originalTime – TimeZone.getDefault().getOffset(originalTime); ps.setDate(1,newDate);데이터를 다시 읽을 때도 같은 변환이 필요합니다.long dbTime = rs.getTimestamp(1).getTime(); Date originalDate = newDate(dbTime + TimeZone.getDefault(); getOffset(dbTime));여기에 한가지 재밌는 점이 있습니다···Java에서 데이터베이스에서 읽을 때는 늘 다음 것을 사용하세요.Timestamp myDate=resultSet.getTimestamp(“my_date”, Calendar.getInstance(TimeZone.getTimeZone(“UTC”);MySql은 실제로해당 Calendar매개변수를무시합니다.전달하는 달력에 관계 없이 같은 값을 갚겠습니다.여기 또 하나 재미있는 점이 있습니다… 자바에서 데이터베이스에서 읽을 때는 항상 다음 것을 사용하십시오. Timestamp myDate= resultSet.getTimestamp(“my_date”, Calendar.getInstance(TimeZone.getTimeZone(“UTC”)));MySql은 실제로 해당 Calendar 매개변수를 무시합니다。 전달할 달력에 관계없이 동일한 값을 반환합니다.Java날짜는 시간대에 매달리지 않습니다.항상 Epoch에서 밀리초 단위의 GMD(UTC)날짜를 나타냅니다.타임 존이 관련된 유일한 시간은 날짜를 문자열로 변환하거나 데이터 문자열을 날짜 객체로 해석할 때입니다.Java 날짜는 시간대에 구애받지 않습니다. 항상 Epoch에서 밀리초 단위의 GMD(UTC) 날짜를 나타냅니다.타임존이 연관되어 있는 유일한 시간은 날짜를 문자열로 내보내거나 데이터 문자열을 날짜 객체로 해석할 때입니다.