2017-06-08 10 views
0

夏時間(年に2回)のため時計を移動すると、Javaで日付が正しくない(中央ヨーロッパに拠点を置いています:GMT+2、​​冬)Jboss Java日付夏時間

時間が1時間進むと、new Date()はまだ古い時間(現在の時間の1時間遅れ)を返します。

Java 7では、Jbossアプリケーションサーバーを再起動せずにこれを解決できますか?

Windowsで手動で時刻を変更すると、問題が再現されます。Dateは、jbossが再起動されない限りシステム日付に更新されません。

Calendar c = Calendar.getInstance(); 
c.setTime(new Date()); 
+1

ので、あなた:あなたはorg.threeten.bp.format.DateTimeFormatterクラスを使用して、形式を変更したい場合(すべての可能なフォーマットの詳細についてはjavadocを見てみましょう)あなたのアプリがタイムスタンプでどのように動作するかを見直したいかもしれません。そして、私の知る限り、そのクラスはタイムゾーンやDSTの移行をサポートしていないので、 'Date'から移行することもできます。 'java.time'パッケージのクラスを使うか、まだJava8を持っていない場合は、少なくとも' java.util.Calendar'を使います。 –

+4

Dateオブジェクトにはタイムゾーン情報がありません。エポック時のミリ秒数です。印刷時のデフォルトのタイムゾーンが表示されますが、状態には影響しません。 – assylias

+0

はカレンダーとsetTime(新しい日付())を使用していました。再起動せずに現在のシステム日付を取得したいだけです。システム日付を手動で更新すると、現在のカレンダーの日付は再起動せずに更新されません。 – kandan

答えて

2

でのJava < = 7を、あなたはThreeTen Backport、Javaの8の新しい日付/時間の授業のための偉大なバックポートを使用することができます。

これにより、DSTの変更を簡単に処理できます。

最初にorg.threeten.bp.DateTimeUtilsを使用してからCalendarに変換することができます。

は、次のコードでは、変換Calendar「UTCの瞬間」(タイムゾーンのタイムスタンプ独立して表すクラスであるorg.threeten.bp.Instant、へ:今、この瞬間に、世界では誰もが同じ瞬間にあるが、にもかかわらず、彼ら地域の日付と時刻は、地域によって異なる場合があります)。

次に、Instantは、org.threeten.bp.ZonedDateTime(この瞬間に、このタイムゾーンの日付と時刻は何ですか?)に変換されます。私はまた、タイムゾーンを取得するためにorg.threeten.bp.ZoneIdを使用:

Calendar c = Calendar.getInstance(); 
c.setTime(new Date()); 

// get the current instant in UTC timestamp 
Instant now = DateTimeUtils.toInstant(c); 

// convert to some timezone 
ZonedDateTime z = now.atZone(ZoneId.of("Europe/Berlin")); 

// today is 08/06/2017, so Berlin is in DST (GMT+2) 
System.out.println(z); // 2017-06-08T14:11:58.608+02:00[Europe/Berlin] 

// testing with a date in January (not in DST, GMT+1) 
System.out.println(z.withMonth(1)); // 2017-01-08T14:11:58.608+01:00[Europe/Berlin] 

私はちょうど中央ヨーロッパのタイムゾーン(Europe/Berlin)を使用して、いくつかのタイムゾーンを選んだ:彼らはambiguous and not standardあるので、あなたは、これらの3文字の略語を使用することはできません。あなたのシステムに最適なタイムゾーンにコードを変更することができます(ZoneId.getAvailableZoneIds()で利用可能なすべてのタイムゾーンのリストを得ることができます)。それは私たちがユーザーに表示するために使用している(DateCalendartoString()方法は舞台裏で、デフォルトのタイムゾーンを使用すると、あなたは、彼らがやっているのかを知ることはありません)何のタイムゾーンの明示的なので

私はこのソリューションを好みます。

内部では、UTCのInstantを使用していますので、タイムゾーンの影響を受けません(いつでも必要に応じてタイムゾーンに変換できます)。ZonedDateTimeを元に戻したい場合はInstantの場合は、toInstant()メソッドを使用してください。


あなたは、現在の日付/時刻を取得したい場合は、実際に、単に古いクラス(DateCalendarを)忘れて、ただInstantを使用します。

// get the current instant in UTC timestamp 
Instant now = Instant.now(); 

しかし、あなたはまだ使用する必要がある場合古いクラスでは、DateTimeUtilsを使用してコンバージョンを実行します。


上記の出力例はZonedDateTime.toString()メソッドの結果です。この動作は正しいタイムゾーンを使用していないあなたはおそらくであることを意味

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy HH:mm:ss z X"); 
// DST (GMT+02) 
System.out.println(formatter.format(z)); // 08/06/2017 14:11:58 CEST +02 
// not DST (GMT+01) 
System.out.println(formatter.format(z.withMonth(1))); // 08/01/2017 14:11:58 CET +01 
関連する問題