この記事について
Java基礎 第17回ではコレクションについて解説しました。
本記事は、Javaにおける『日付』と時間の取り扱いに関する深堀り的な解説となっています。日付と時間はプログラミングにおいて頻繁に扱う概念であり、それらを取り扱うための各種クラスやメソッドについて、Dateクラス、Calendarクラス、java.timeパッケージに至るまで、詳細に解説しています。
Javaの日付・時間操作について初めて学ぶ初学者にとっても、各クラスやメソッドの説明が丁寧で、具体的なコード例が豊富にあるため、理解しやすい内容となっています。
はじめに
日付や時間はプログラミングの中でよく遭遇するもので、ログのタイムスタンプ、ユーザーの誕生日など、さまざまなデータを扱う上で必要不可欠な要素です。しかし、日付や時間は意外と扱いが複雑で、タイムゾーン、夏時間、うるう年など、さまざまな要素を考慮する必要があります。この記事では、Javaにおける日付・時間の扱いについて詳しく学んでいきましょう。
java.util.Dateについて
Dateクラスの概要
Javaで最初に提供された日付を扱うクラスはjava.util.Dateクラスです。このクラスは1970年1月1日00:00:00 GMT(世界協定時)からのミリ秒単位の経過時間を保持します。
Date date = new Date();
System.out.println(date); // 実行時の日時を出力します。
上記のコードでは、現在の日付と時刻を取得しています。new Date()を使用すると、その時点の日付と時刻が設定されます。
Dateクラスの主要なメソッドと使用例
しかし、Dateクラスは古い設計で、月が0から始まるなど直感的でない部分があります。また、日付や時間を個別に設定したり取得したりするメソッドは非推奨となっています。
Date date = new Date();
int year = date.getYear(); // 非推奨
上記のコードは、getYearメソッドを使用して年を取得していますが、このメソッドは非推奨とされています。したがって、新たに開発を行う場合にはDateクラスの使用は避け、Calendarクラスやjava.timeパッケージのクラスの使用を推奨します。
java.util.Calendarについて
Calendarクラスの概要
java.util.Calendarクラスは、日付や時間を個別に設定したり取得したりするためのメソッドを提供します。また、タイムゾーンやロケールを考慮した日付や時間の計算が可能です。
Calendar calendar = Calendar.getInstance();
System.out.println(calendar.get(Calendar.YEAR)); // 年を取得
上記のコードでは、現在の年を取得しています。Calendar.getInstance()を使用すると、その時点の日付と時刻が設定されたCalendarインスタンスが取得できます。そのインスタンスから.get(Calendar.YEAR)を呼び出すと、年を取得できます。
Calendarクラスの主要なメソッドと使用例
CalendarクラスはDateクラスよりも直感的に日付や時間を扱うことができます。また、日付や時間の計算も容易です。
Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.DAY_OF_MONTH, 1); // 1日加算
Date tomorrow = calendar.getTime(); // CalendarからDateへの変換
上記のコードでは、現在の日付に1日を加算して、明日の日付を取得しています。calendar.add(Calendar.DAY_OF_MONTH, 1)を使用すると、現在の日付に1日を加算できます。また、calendar.getTime()を使用すると、CalendarインスタンスからDateインスタンスへの変換が可能です。
java.timeパッケージについて
java.timeパッケージの概要
Java 8から導入されたjava.timeパッケージは、これまでのDateクラスやCalendarクラスの問題を解決するために設計されました。このパッケージでは、不変の日付・時間オブジェクトを提供しています。
LocalDate、LocalTime、LocalDateTime
java.timeパッケージには、日付を表すLocalDateクラス、時間を表すLocalTimeクラス、日付と時間を表すLocalDateTimeクラスなどがあります。
LocalDate date = LocalDate.now();
LocalDate tomorrow = date.plusDays(1); // 1日加算
上記のコードでは、現在の日付を取得し、その日付に1日加算しています。LocalDate.now()で現在の日付を取得し、plusDays(1)でその日付に1日を加算しています。java.timeパッケージのクラスは不変であるため、元のdateインスタンスは変化せず、新たな日付がtomorrowに設定されます。
日付・時間のフォーマットについて
SimpleDateFormatクラスについて
日付や時間の文字列とJavaの日付や時間のクラスとの間の変換を行うためのクラスとして、java.text.SimpleDateFormatクラスが提供されています。
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
String formatted = sdf.format(new Date()); // Date -> String
Date date = sdf.parse(formatted); // String -> Date
上記のコードでは、まずパターン文字列”yyyy/MM/dd”を用いてSimpleDateFormatインスタンスを作成しています。その後、sdf.format(new Date())で現在の日付を指定の形式の文字列に変換し、sdf.parse(formatted)で文字列を日付に変換しています。
DateTimeFormatterクラスについて
java.time.format.DateTimeFormatterクラスは、java.timeパッケージの日付や時間のクラスと文字列との間の変換を行います。
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy/MM/dd");
String formatted = dtf.format(LocalDate.now()); // LocalDate -> String
LocalDate date = LocalDate.parse(formatted, dtf); // String -> LocalDate
上記のコードでは、まずパターン文字列”yyyy/MM/dd”を用いてDateTimeFormatterインスタンスを作成しています。その後、dtf.format(LocalDate.now())で現在の日付を指定の形式の文字列に変換し、LocalDate.parse(formatted, dtf)で文字列を日付に変換しています。
日付・時間の操作について
日付・時間の加算・減算
java.util.Calendarクラスとjava.timeパッケージのクラスは、日付や時間の加算・減算を直感的に行うことができます。
// Calendar
Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.DAY_OF_MONTH, 1); // 1日加算
// java.time
LocalDate date = LocalDate.now();
LocalDate tomorrow = date.plusDays(1); // 1日加算
上記のコードは、CalendarクラスとLocalDateクラスを使用して、現在の日付に1日を加算する例です。どちらの方法でも、明日の日付を取得することができます。
日付間の差の計算
日付間の差の計算
LocalDate date1 = LocalDate.of(2023, 7, 24);
LocalDate date2 = LocalDate.of(2023, 7, 31);
long daysBetween = ChronoUnit.DAYS.between(date1, date2); // 7
上記のコードでは、2023年7月24日と2023年7月31日の間の日数を計算しています。ChronoUnit.DAYS.between(date1, date2)で、date1とdate2の間の日数を取得できます。
使用例
LocalDate birthday = LocalDate.of(1990, Month.JANUARY, 1);
LocalDate today = LocalDate.now();
long age = ChronoUnit.YEARS.between(birthday, today); // 年齢の計算
上記のコードでは、誕生日から現在までの年齢を計算しています。ChronoUnit.YEARS.between(birthday, today)で、birthdayとtodayの間の年数を取得できます。
時間の比較について
DateとCalendarによる比較方法
java.util.Dateとjava.util.Calendarクラスは、compareToメソッドやequalsメソッドを用いて比較することができます。
Date date1 = new Date();
Date date2 = new Date();
boolean isEqual = date1.equals(date2); // date1とdate2が等しいか比較
上記のコードでは、date1とdate2が等しいかどうかを比較しています。このようにequalsメソッドを使用すると、2つの日付が等しいかどうかを判断できます。
LocalDate、LocalTime、LocalDateTimeによる比較方法
java.timeパッケージのクラスは、isEqual、isBefore、isAfterメソッドを提供します。
LocalDate date1 = LocalDate.of(2023, 7, 24);
LocalDate date2 = LocalDate.of(2023, 7, 31);
boolean isBefore = date1.isBefore(date2); // date1がdate2より前か比較
上記のコードでは、date1がdate2より前かどうかを比較しています。このように、java.timeパッケージのクラスを使用すると、2つの日付の前後関係を直感的に比較することができます。
まとめ
Javaには、Date、Calendar、java.timeパッケージなど、さまざまな日付・時間を扱うクラスが提供されています。これらのクラスを理解し、適切に使用することで、日付や時間を効率的に扱うことができます。
今回の日付の内容は、Javaプログラムにおいて日付関係のコードを組む際に使用するものです。
様々な使い方がありますので、全てを覚えるわけではなく必要な時に必要な機能を使えるような準備をしておくことが重要です。
次回は例外クラスについて紹介していきます。
お楽しみに!
コメント