java.time
java.util
Date-Time API とその書式設定 APIはSimpleDateFormat
時代遅れで、エラーが発生しやすいものです。それらの使用を完全に停止し、最新の Date-Time APIに切り替えることをお勧めします*。
また、以下はJoda-Timeのホームページからの通知です。
Java SE 8 以降では、このプロジェクトを置き換える JDK のコア部分である java.time (JSR-310) に移行するように求められることに注意してください。
java.time
最新の Date-Time APIを使用したソリューション:太平洋タイム ゾーンで最大の都市はロサンゼルスで、そのタイムゾーン名はAmerica/Los_Angelesです。を使用して、 DST移行時にタイムゾーン オフセットを自動的に調整するように設計されZoneId.of("America/Los_Angeles")
た のインスタンスを作成できます 。ZonedDateTime
タイムゾーン名ではなくタイムゾーン オフセットが必要な場合は、 aZonedDateTime
をOffsetDateTime
usingに変換できますZonedDateTime#toOffsetDateTime
。のその他の用途としてOffsetDateTime
は、固定のタイムゾーン オフセットを使用して Date-Time インスタンスを作成すること (たとえばInstant.now().atOffset(ZoneOffset.of("+05:30"))
、 や、タイムゾーン オフセットを使用して Date-Time 文字列を解析すること) があります。
デモ:
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.OffsetDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.temporal.ChronoUnit;
public class Main {
public static void main(String[] args) {
ZoneId zoneIdLosAngeles = ZoneId.of("America/Los_Angeles");
ZonedDateTime zdtNowLosAngeles = ZonedDateTime.now(zoneIdLosAngeles);
System.out.println(zdtNowLosAngeles);
// With zone offset but without time zone name
OffsetDateTime odtNowLosAngeles = zdtNowLosAngeles.toOffsetDateTime();
System.out.println(odtNowLosAngeles);
// Truncated up to seconds
odtNowLosAngeles = odtNowLosAngeles.truncatedTo(ChronoUnit.SECONDS);
System.out.println(odtNowLosAngeles);
// ################ A winter date-time ################
ZonedDateTime zdtLosAngelesWinter = ZonedDateTime
.of(LocalDateTime.of(LocalDate.of(2021, 11, 20), LocalTime.of(10, 20)), zoneIdLosAngeles);
System.out.println(zdtLosAngelesWinter); // 2021-11-20T10:20-08:00[America/Los_Angeles]
System.out.println(zdtLosAngelesWinter.toOffsetDateTime()); // 2021-11-20T10:20-08:00
// ################ Parsing a date-time string with zone offset ################
String strDateTime = "2008-11-13T13:23:30-08:00";
OffsetDateTime odt = OffsetDateTime.parse(strDateTime);
System.out.println(odt); // 2008-11-13T13:23:30-08:00
}
}
サンプル実行からの出力:
2021-07-18T03:27:15.578028-07:00[America/Los_Angeles]
2021-07-18T03:27:15.578028-07:00
2021-07-18T03:27:15-07:00
2021-11-20T10:20-08:00[America/Los_Angeles]
2021-11-20T10:20-08:00
2008-11-13T13:23:30-08:00
ONLINE DEMO
DateTimeFormatter
あなたの質問の日時文字列を解析するためにa を使用していないことに気付いたに違いありません。これは、日時文字列が ISO-8601 標準に準拠しているためです。最新の Date-Time API はISO 8601に基づいてDateTimeFormatter
おり、Date-Time 文字列が ISO 8601 標準に準拠している限り、オブジェクトを明示的に使用する必要はありません。
最新の Date-Time API の詳細については、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 を使用する方法 を確認してください。