での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()
で利用可能なすべてのタイムゾーンのリストを得ることができます)。それは私たちがユーザーに表示するために使用している(Date
とCalendar
のtoString()
方法は舞台裏で、デフォルトのタイムゾーンを使用すると、あなたは、彼らがやっているのかを知ることはありません)何のタイムゾーンの明示的なので
私はこのソリューションを好みます。
内部では、UTCのInstant
を使用していますので、タイムゾーンの影響を受けません(いつでも必要に応じてタイムゾーンに変換できます)。ZonedDateTime
を元に戻したい場合はInstant
の場合は、toInstant()
メソッドを使用してください。
あなたは、現在の日付/時刻を取得したい場合は、実際に、単に古いクラス(Date
とCalendar
を)忘れて、ただ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
ので、あなた:あなたは
org.threeten.bp.format.DateTimeFormatter
クラスを使用して、形式を変更したい場合(すべての可能なフォーマットの詳細についてはjavadocを見てみましょう)あなたのアプリがタイムスタンプでどのように動作するかを見直したいかもしれません。そして、私の知る限り、そのクラスはタイムゾーンやDSTの移行をサポートしていないので、 'Date'から移行することもできます。 'java.time'パッケージのクラスを使うか、まだJava8を持っていない場合は、少なくとも' java.util.Calendar'を使います。 –Dateオブジェクトにはタイムゾーン情報がありません。エポック時のミリ秒数です。印刷時のデフォルトのタイムゾーンが表示されますが、状態には影響しません。 – assylias
はカレンダーとsetTime(新しい日付())を使用していました。再起動せずに現在のシステム日付を取得したいだけです。システム日付を手動で更新すると、現在のカレンダーの日付は再起動せずに更新されません。 – kandan