Java 8 - 新しい日時API
こんにちは、未来のJava魔法使いたち!? 今日は、Javaの不思議な日時APIの世界に一緒に飛び込みます。心配しないでください。これまで一度もコードを書いたことがなくても、私たちは一緒に基礎から始めて少しずつ進んでいきます。このレッスンが終わる頃には、プロのように日時を弄ぶことができるようになるでしょう!それでは、始めましょう!
Javaの日時APIの紹介
時計のようなもの(カッコいいですね!)を建てているとしましょう。それを動かすために、日時を正確に扱う必要があります。これが、Javaの日時APIが私たちのプログラムでしてくれることです。まるで超精密な時計とカレンダーが一体化したようなものです!
なぜ新しいAPIが必要なのか?
本題に入る前に、おそらく「なぜJavaは新しい日時APIを作成したのか?」と思っているかもしれません。ちょっとした話を聞かせてください。
昔々(Java 8以前)、開発者は古いjava.util.Date
とjava.util.Calendar
クラスを使っていました。これらはまるで古い、錆びたった時計を使うようなもので、動作はしましたが、多くの問題がありました。使いにくく、スレッドセーフではなかった(複雑なプログラムで問題を引き起こす可能性がある)、そしてタイムゾーンの対応が悪かったのです。
そこで、Javaチームはこれらの問題を解決するために、全新的しい、輝かしいAPIを作成することに決めました。そして、Java 8でjava.time
パッケージが生まれました!
Javaのローカル日時API
それでは基礎から始めましょう。ローカル日時APIは、タイムゾーンを気にせずに日時を扱う帮助我们します。デスクに置かれたシンプルな時計とカレンダーのようなものです。
LocalDate
LocalDate
はタイムゾーンのない日付を表します。使い方を見てみましょう:
import java.time.LocalDate;
public class DateExample {
public static void main(String[] args) {
LocalDate today = LocalDate.now();
System.out.println("今日の日付は: " + today);
LocalDate specificDate = LocalDate.of(2023, 6, 15);
System.out.println("特定の日付: " + specificDate);
}
}
この例では、2つのことをしています:
-
LocalDate.now()
を使って今日の日付を取得しています。 -
LocalDate.of()
を使って特定の日付(2023年6月15日)を作成しています。
このコードを実行すると、今日の日付と作成した特定の日付が表示されます。
LocalTime
LocalTime
は日付なしで時間を表します。使い方を見てみましょう:
import java.time.LocalTime;
public class TimeExample {
public static void main(String[] args) {
LocalTime now = LocalTime.now();
System.out.println("現在の時間は: " + now);
LocalTime specificTime = LocalTime.of(14, 30, 45);
System.out.println("特定の時間: " + specificTime);
}
}
この例では、2つのことをしています:
-
LocalTime.now()
を使って現在の時間を取得しています。 -
LocalTime.of()
を使って特定の時間(14時30分45秒)を作成しています。
LocalDateTime
LocalDateTime
は日付と時間を組み合わせていますが、タイムゾーンは含まれていません。時計に日付表示があるようなものです。使い方を見てみましょう:
import java.time.LocalDateTime;
public class DateTimeExample {
public static void main(String[] args) {
LocalDateTime now = LocalDateTime.now();
System.out.println("現在の日時: " + now);
LocalDateTime specificDateTime = LocalDateTime.of(2023, 6, 15, 14, 30, 45);
System.out.println("特定の日時: " + specificDateTime);
}
}
この例では、2つのことをしています:
-
LocalDateTime.now()
を使って現在の日時を取得しています。 -
LocalDateTime.of()
を使って特定の日時(2023年6月15日14時30分45秒)を作成しています。
Javaのタイムゾーン付き日時API
それでは、時間帯を追加してみましょう。タイムゾーン付き日時APIは、異なるタイムゾーンの日時を扱う帮助我们します。
ZonedDateTime
ZonedDateTime
はタイムゾーン付きの日時を表します。世界の異なる地域の時間を表示する世界時計のようなものです。
import java.time.ZonedDateTime;
import java.time.ZoneId;
public class ZonedDateTimeExample {
public static void main(String[] args) {
ZonedDateTime nowInSystemTZ = ZonedDateTime.now();
System.out.println("システムのタイムゾーンでの現在の日時: " + nowInSystemTZ);
ZonedDateTime nowInParis = ZonedDateTime.now(ZoneId.of("Europe/Paris"));
System.out.println("パリでの現在の日時: " + nowInParis);
}
}
この例では、2つのことをしています:
-
ZonedDateTime.now()
を使ってシステムのデフォルトタイムゾーンでの現在の日時を取得しています。 -
ZonedDateTime.now(ZoneId.of("Europe/Paris"))
を使ってパリでの現在の日時を取得しています。
Javaの暦units列挙型
ChronoUnit
列挙型は、標準的な日時単位と時間単位を提供します。時間を測る異なる道具のようなものです - 秒、分、時間、日、週、月、年など。
import java.time.LocalDateTime;
import java.time.temporal.ChronoUnit;
public class ChronoUnitExample {
public static void main(String[] args) {
LocalDateTime now = LocalDateTime.now();
LocalDateTime futureDateTime = now.plus(1, ChronoUnit.WEEKS);
long daysBetween = ChronoUnit.DAYS.between(now, futureDateTime);
System.out.println("現在から一週間後までの日数: " + daysBetween);
}
}
この例では、2つのことをしています:
-
now.plus(1, ChronoUnit.WEEKS)
を使って現在から一週間後の日時を作成しています。 -
ChronoUnit.DAYS.between()
を使って現在と一週間後の日時の間の日数を計算しています。
JavaのPeriodとDuration
Period
とDuration
は時間の量を表します。Period
はカレンダー上的な日付の差、Duration
はストップウォッチの時間のようなものです。
import java.time.LocalDate;
import java.time.Period;
import java.time.Duration;
import java.time.LocalTime;
public class PeriodDurationExample {
public static void main(String[] args) {
LocalDate date1 = LocalDate.of(2023, 1, 1);
LocalDate date2 = LocalDate.of(2023, 12, 31);
Period period = Period.between(date1, date2);
System.out.println("2023年1月1日と2023年12月31日之间的期間: " + period);
LocalTime time1 = LocalTime.of(9, 0);
LocalTime time2 = LocalTime.of(17, 30);
Duration duration = Duration.between(time1, time2);
System.out.println("9時と17時30分之间的時間: " + duration);
}
}
この例では、2つのことをしています:
-
Period.between()
を使って二つの日付の間の期間を計算しています。 -
Duration.between()
を使って二つの時間の間の時間を計算しています。
JavaのTemporal Adjusters
Temporal Adjustersは日付を魔法のように調整する帮助我们します。次の月曜日や月の最終日などの日付を簡単に見つけることができます。
import java.time.LocalDate;
import java.time.temporal.TemporalAdjusters;
public class TemporalAdjustersExample {
public static void main(String[] args) {
LocalDate date = LocalDate.now();
LocalDate nextMonday = date.with(TemporalAdjusters.next(DayOfWeek.MONDAY));
System.out.println("次の月曜日: " + nextMonday);
LocalDate lastDayOfMonth = date.with(TemporalAdjusters.lastDayOfMonth());
System.out.println("今月の最終日: " + lastDayOfMonth);
}
}
この例では、2つのことをしています:
-
TemporalAdjusters.next(DayOfWeek.MONDAY)
を使って次の月曜日を見つけています。 -
TemporalAdjusters.lastDayOfMonth()
を使って今月の最終日を見つけています。
後方互換性
今までの古いコードが使えなくなるかもと思っているかもしれませんが、心配しないでください!Javaはそれも考えられています。新しいAPIには、古い日時クラスと新しい日時クラスの間で変換するメソッドが提供されています。
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.Date;
public class BackwardCompatibilityExample {
public static void main(String[] args) {
// 古いDateから新しいLocalDateTimeへの変換
Date oldDate = new Date();
LocalDateTime newDateTime = LocalDateTime.ofInstant(oldDate.toInstant(), ZoneId.systemDefault());
System.out.println("古いDate: " + oldDate);
System.out.println("新しいLocalDateTime: " + newDateTime);
// 新しいLocalDateTimeから古いDateへの変換
LocalDateTime localDateTime = LocalDateTime.now();
Date date = Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
System.out.println("新しいLocalDateTime: " + localDateTime);
System.out.println("古いDate: " + date);
}
}
この例では、2つのことをしています:
- 古い
Date
オブジェクトを新しいLocalDateTime
オブジェクトに変換しています。 - 新しい
LocalDateTime
オブジェクトを古いDate
オブジェクトに変換しています。
この後方互換性により、古いJavaコードでも新しい日時APIの利点を享受できます。
結論
おめでとうございます!あなたはJavaの日時APIの世界への最初の一歩を踏み出しました。私たちは多くのことをカバーしました。基本的な日時の処理から、タイムゾーンや暦units、時間の調整などの高度な概念までです。
覚えることは多く、最初は混乱するかもしれませんが、経験豊富な開発者でさえもこれらのクラスの使い方を調べることがあります!
これらの例を試してみて、変更を加えてみて、何が起こるかを確認してください。時間が経つにつれて、あなたも日時の manipulation に精通するでしょう!
快適なコーディングをし、あなたのタイミングが常に完璧であることを祈っています!⏰?
Credits: Image by storyset