web-dev-qa-db-ja.com

GMT / UTCとしてJavaタイムゾーンを強制する

マシンに設定されているタイムゾーンに関係なく、時間関連の操作をGMT/UTCに強制する必要があります。コードでそうするための便利な方法はありますか?

明確にするために、私はすべての操作にDBサーバー時間を使用していますが、ローカルタイムゾーンに従ってフォーマットされています。

ありがとう!

84
SyBer

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

109
Kevin Brock

また、この方法でJVMタイムゾーンを設定できる場合

System.setProperty("user.timezone", "EST");

または-Duser.timezone=GMTのJVM引数。

20
MG Developer

新しいDate()に対して常にGMTを返すため、Windows 2003 ServerのJVMタイムゾーンを設定する必要がありました。

-Duser.timezone=America/Los_Angeles

または適切なタイムゾーン。タイムゾーンのリストを見つけることも少し難しいことが判明しました...

以下に2つのリストを示します。

http://wrapper.tanukisoftware.com/doc/english/prop-timezone.html

http://publib.boulder.ibm.com/infocenter/iseries/v5r3/index.jsp?topic=%2Frzatz%2F51%2Fadmin%2Freftz.htm

10
Todd

私にとっては、簡単な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"));
  }

次に、異なるタイムゾーンで日付をフォーマットします。

8
lwpro2

生の形式(長いタイムスタンプまたはJavaの日付)でDBから時間を取得し、SimpleDateFormatを使用してフォーマットするか、Calendarを使用して操作します。どちらの場合も、使用する前にオブジェクトのタイムゾーンを設定する必要があります。

詳細については、SimpleDateFormat.setTimeZone(..)およびCalendar.setTimeZone(..)を参照してください

6
Eyal Schneider

TimeZone.setDefault() を使用してタイムゾーンを変更できます。

TimeZone.setDefault(TimeZone.getTimeZone("GMT"))
4
snorbi

システムプロパティを使用します。

-Duser.timezone=UTC
1
Dawid Stępień

クライアント/サーバーのペアを作成して、実行後にクライアントサーバーが正しい日時を送信するようにします。次に、クライアントはサーバーにGMT pmを要求し、サーバーは応答権を送り返します。

1
bertan

ワオ。私はこれが古代のスレッドであることを知っていますが、私が言えることは、ユーザーレベルのコードでTimeZone.setDefault()を呼び出さないことです。これは常にJVM全体のタイムゾーンを設定し、ほぼalwaysは非常に悪い考えです。 joda.timeライブラリーまたはjoda.timeライブラリーに非常によく似たJava 8の新しいDateTimeクラスの使用方法を学びます。

1
scot