マシンに設定されているタイムゾーンに関係なく、時間関連の操作をGMT/UTCに強制する必要があります。コードでそうするための便利な方法はありますか?
明確にするために、私はすべての操作にDBサーバー時間を使用していますが、ローカルタイムゾーンに従ってフォーマットされています。
ありがとう!
OPはこの質問に答えて、実行中のJVMの単一インスタンスのデフォルトのタイムゾーンを変更し、user.timezone
システムプロパティを設定しました。
Java -Duser.timezone=GMT ... <main-class>
データベースResultSet
からDate/Time/Timestampオブジェクトを取得するときに特定のタイムゾーンを設定する必要がある場合は、getXXX
オブジェクトを取るCalendar
メソッドの2番目の形式を使用します。
Calendar tzCal = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
ResultSet rs = ...;
while (rs.next()) {
Date dateValue = rs.getDate("DateColumn", tzCal);
// Other fields and calculations
}
または、PreparedStatementで日付を設定します。
Calendar tzCal = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
PreparedStatement ps = conn.createPreparedStatement("update ...");
ps.setDate("DateColumn", dateValue, tzCal);
// Other assignments
ps.executeUpdate();
これにより、データベース列にタイムゾーン情報が保持されない場合に、データベースに格納されている値の一貫性が確保されます。
Java.util.Date
およびJava.sql.Date
クラスは、UTCで実際の時間(ミリ秒)を格納します。別のタイムゾーンへの出力でこれらをフォーマットするには、SimpleDateFormat
を使用します。 Calendarオブジェクトを使用して、タイムゾーンを値に関連付けることもできます。
TimeZone tz = TimeZone.getTimeZone("<local-time-zone>");
//...
Date dateValue = rs.getDate("DateColumn");
Calendar calValue = Calendar.getInstance(tz);
calValue.setTime(dateValue);
役に立つリファレンス
https://docs.Oracle.com/javase/9/troubleshoot/time-zone-settings-jre.htm#JSTGD377
https://confluence.atlassian.com/kb/setting-the-timezone-for-the-Java-environment-841187402.html
また、この方法でJVMタイムゾーンを設定できる場合
System.setProperty("user.timezone", "EST");
または-Duser.timezone=GMT
のJVM引数。
新しいDate()に対して常にGMTを返すため、Windows 2003 ServerのJVMタイムゾーンを設定する必要がありました。
-Duser.timezone=America/Los_Angeles
または適切なタイムゾーン。タイムゾーンのリストを見つけることも少し難しいことが判明しました...
以下に2つのリストを示します。
http://wrapper.tanukisoftware.com/doc/english/prop-timezone.html
私にとっては、簡単なSimpleDateFormatだけです。
private static final SimpleDateFormat GMT = new SimpleDateFormat("yyyy-MM-dd");
private static final SimpleDateFormat SYD = new SimpleDateFormat("yyyy-MM-dd");
static {
GMT.setTimeZone(TimeZone.getTimeZone("GMT"));
SYD.setTimeZone(TimeZone.getTimeZone("Australia/Sydney"));
}
次に、異なるタイムゾーンで日付をフォーマットします。
生の形式(長いタイムスタンプまたはJavaの日付)でDBから時間を取得し、SimpleDateFormatを使用してフォーマットするか、Calendarを使用して操作します。どちらの場合も、使用する前にオブジェクトのタイムゾーンを設定する必要があります。
詳細については、SimpleDateFormat.setTimeZone(..)
およびCalendar.setTimeZone(..)
を参照してください
TimeZone.setDefault() を使用してタイムゾーンを変更できます。
TimeZone.setDefault(TimeZone.getTimeZone("GMT"))
システムプロパティを使用します。
-Duser.timezone=UTC
クライアント/サーバーのペアを作成して、実行後にクライアントサーバーが正しい日時を送信するようにします。次に、クライアントはサーバーにGMT pmを要求し、サーバーは応答権を送り返します。
ワオ。私はこれが古代のスレッドであることを知っていますが、私が言えることは、ユーザーレベルのコードでTimeZone.setDefault()を呼び出さないことです。これは常にJVM全体のタイムゾーンを設定し、ほぼalwaysは非常に悪い考えです。 joda.timeライブラリーまたはjoda.timeライブラリーに非常によく似たJava 8の新しいDateTimeクラスの使用方法を学びます。