【超簡単】Javaで日付を扱うならJava.timeで優勝。

zuka

こんにちは。zuka(@beginaid)です。

本記事では,Javaにおける日付の簡単な扱い方をお伝えしていきます。

目次

結論

Java.timeパッケージを利用しましょう。こちらはJava8から追加されたパッケージになっています。例えば,以下のような処理が可能です。

LocalDateTime day = LocalDateTime.now();
DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss");

// 現在時刻の表示
// 2021/04/17 22:10:37
System.out.println(day.format(fmt)); 

// 日付の足し算
// 2021/04/20 22:10:37
System.out.println(day.plusDays(3).format(fmt));

// 日時の間隔(差分)の計算
// 1カ月14日間
LocalDate from = LocalDate.of(2021, 4, 17);
LocalDate to = LocalDate.of(2021, 5, 31);
Period period = Period.between(from, to);
System.out.println(String.format("%dカ月%d日間", period.getMonths(), period.getDays()));

Web上では古い情報が錯綜していて,今でも「Javaで日付と言ったらjava.util.Dateクラスかjava.util.Calendarクラスだ!」といった主張をされるWebサイトも散見されます。しかし,後述の理由から今ではJava.timeパッケージを利用する方針が無難だとされています。

かくいう自分もググったらjava.util.Dateクラスかjava.util.Calendarクラスの情報しか出てこなかったため,2つの日付の間隔を月・年単位で表す計算に四苦八苦していました。ところが,上記コード例のように,Java.timeパッケージのPeriodクラスを利用すれば超簡単に求めることができたのです。

従来の方法

Java.time登場以前はjava.util.Dateクラスやjava.util.Calendarクラスが利用されていました。しかし,これらの手法は引数の指定が0始まりのインデックスであったり,並列処理でバグを生じさせる可能性があったりするなど,少々厄介な面がありました。

また,java.util.Dateクラスやjava.util.Calendarクラスの実体は基準日時(1970年1月1日0辞0分0秒)からの差分であり,long型で取得することができます。基準時刻からどれだけ経過したかというシンプルな定義である一方で,例えば2つの日付の差分を計算する場合などでは煩雑な計算が必要でした。

Calendar from = Calendar.getInstance();
Calendar to = Calendar.getInstance();
from.set(2021, 4, 17);
to.set(2021, 5, 21);
long diffTime = to.getTimeInMillis() - from.getTimeInMillis();
// 1日が何ミリ秒かを計算する
int diffDayMillis = 1000 * 60 * 60 * 24;
// 1日あたりのミリ秒数で割る
int diffDays = (int) (diffTime / diffDayMillis);
// 35日
System.out.println(diffDays);

さらに,LocalDateクラスでは%dカ月%d日間 という形式で差分を出力することができましたが,Dateクラスでは計算がさらに煩雑になります。というのも,1日あたりのミリ秒数は同じである一方で,1月あたりの日数は月によって異なるからです。さらに,うるう年なども考え始めると,1つの日付の差分を日数以外の単位で表すことはそう容易ではありません。

そこで,上記結論のようにJava.timeを利用してあげることで,様々な処理をシンプルに行うことが可能になります。具体的には,nowメソッドで現在日時のインスタンス,parseメソッドで"2021/4/17"などの文字列を解析したインスタンス,更には2つの日付の間隔を表すDurationクラス(時間単位の短めの間隔)やPeriodクラス(年単位の長めの間隔)があります。加えて,Instantクラスは従来のDateクラスよりも正確に(ナノ秒単位で)精度良く日時を取得することができます。

よかったらシェアしてね!
  • URLをコピーしました!

コメント

コメントする

※ Please enter your comments in Japanese to distinguish from spam.

目次