残念ながら、受け入れられた答えは誤解です。実際のところ、
2012-06-01T00:00:00.000+02:00 = 2012-05-31T22:00:00Z
Z
右側の は、ゼロタイムゾーン オフセットのタイムゾーン指定子です。これはズールー語を表し、Etc/UTC
タイムゾーンを指定します (時間のタイムゾーン オフセットがあり+00:00
ます)。
2012-06-01T00:00:00.000+02:00
として記述2012-06-01
することは、単なる関数呼び出しの問題ではありますが、タイムゾーンに依存するビジネス ロジックにとっては危険です。2012-06-01
は、LocalDate
生年月日、結婚日などのイベントを追跡するために使用する必要があります。
java.time
従来の日時 API (java.util
日時型とその書式設定型SimpleDateFormat
など) は時代遅れであり、エラーが発生しやすくなっています。java.time
使用を完全にやめて、最新の日時 API *に切り替えることをお勧めします。
また、以下はJoda-Time のホームページの通知です。
Java SE 8 以降では、このプロジェクトを置き換える JDK のコア部分である java.time (JSR-310) に移行するように求められることに注意してください。
java.time
最新の APIを使用したソリューション:
指定された日時文字列を解析する方法:
指定された日時文字列にはタイムゾーン オフセットがあるため、 に解析する必要がありますOffsetDateTime
。最新の日時 API は ISO 8601 に基づいているDateTimeFormatter
ため、日時文字列が ISO 8601 標準に準拠している限り、オブジェクトを明示的に使用する必要はありません。
OffsetDateTime odt = OffsetDateTime.parse("2012-06-01T00:00:00.000+02:00"); // 2012-06-01T00:00+02:00
UTC で日時を取得する方法:
複数の方法があります。Instant
最も簡単な方法は、UTC のタイムライン上の瞬間的なポイントを表すに変換することです。
Instant instant = odt.toInstant(); // 2012-05-31T22:00:00Z
あるいは、
OffsetDateTime odtUtc = odt.withOffsetSameInstant(ZoneOffset.UTC); // 2012-05-31T22:00Z
それから抜け出す方法java.util.Date
:
java.util.Date
のインスタンスから のインスタンスが必要な場合はOffsetDateTime
、 を使用できますDate#from(Instant instant)
。
Date date = Date.from(instant); // Thu May 31 23:00:00 BST 2012 <--In my timezone
オブジェクトは、最新の日時型のjava.util.Date
ような実際の日時オブジェクトではないことに注意してください。むしろ、「エポック」(または UTC) として知られる標準ベース時刻からのミリ秒数を表します。のオブジェクトを出力すると、そのメソッドは、このミリ秒値から計算された JVM のタイムゾーンで日時を返します。異なるタイムゾーンで日時を出力する必要がある場合は、タイムゾーンを設定して、フォーマットされた文字列を取得する必要があります。January 1, 1970, 00:00:00 GMT
java.util.Date
toString
SimpleDateFormat
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX", Locale.ENGLISH);
sdf.setTimeZone(TimeZone.getTimeZone("Etc/UTC"));
System.out.println(sdf.format(date)); // 2012-05-31T22:00:00.000Z
日付部分を取得する方法:
すでに説明したように、タイムゾーンに依存するビジネス ロジックは危険です。ただし、単純な関数呼び出しの問題です。
LocalDate localDate = odt.toLocalDate(); // 2012-06-01
最新の日時 API *の詳細についてjava.time
は、Trail: Date Timeを参照してください。
* 何らかの理由で、Java 6 または Java 7 に固執する必要がある場合は、 java.time機能のほとんどを Java 6 & 7 にバックポートするThreeTen-Backportを使用できます。Androidプロジェクトと Android API で作業している場合レベルはまだ Java-8 に準拠していません。desugarで利用できる Java 8+ APIと Android プロジェクトで ThreeTenABP を使用する方法 を確認してください。