すずろぐ

人生大逆転を目指す、鈴木俊吾の成長日記

Java 日時を扱うLocalDateTimeクラスの基本的な使い方

日付

こんにちは、すずしんです。

Javaのプログラミングをするにあたって、日付操作をする必要が出てきました。 そこで、Java8から導入されたLocalDateTimeクラスについて今回勉強してみました。 今回の記事では、このLocalDateTimeクラスの基本的な使い方についてまとめてみます。

API

Java7までは、Date/Calendar/DateFormatクラスなどを主に使用して日付関連の操作を行っていましたが…。 Java8からは、java.timeパッケージに新しくAPIが追加されています。 例としては以下のようなクラスがあります。

・Instant - 日時(エポック秒) ・LocalDateTime - タイムゾーンなし日時 ・ZonedDateTime - タイムゾーンあり日時 ・OffsetDateTime - オフセットあり日時

特徴

日付関連の新APIの特徴としては、以下のような点が挙げられます。

・データを格納するクラスは、日時/日付のみ/時間のみなど保持する要素やタイムゾーンの有無などによって、複数のクラスから選べるようになりました。 ・データの保持と日付操作が1クラスでできるようになりました。 ・日時クラスはImmutableなオブジェクトになり、既存インスタンスの値を変更する際は新しくインスタンスを作成する事になります。 ・旧APIで月の値は0-11でしたが、新APIでは1-12になりました。

LocalDateTimeクラス

APIで新しく追加されたクラスはかなりあるのですが…。 ここでは、LocalDateTimeクラスに絞って基本的な使い方についてまとめてみます。

現在日時の取得 - now

LocalDateTimeクラスで現在日時を取得するには、now()メソッドを使用します。

LocalDateTime d = LocalDateTime.now();

インスタンスの作成 - of

インスタンスの生成にはof()メソッドが使えます。

//年月日時分秒を指定
LocalDateTime d1 = LocalDateTime.of(2016, 11, 10, 13, 15, 0);

DateTimeFormatterを使ったフォーマット

DateTimeFormatterクラスを使ってLocalDateTimeクラスのフォーマットをすることもできます。

DateTimeFormatter f = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss");
LocalDateTime d = LocalDateTime.parse("2016/11/10 13:30:00", f);
System.out.println(d.format(f));

フィールドの取得 - get

特定のフィールド値を取得するにはget***()メソッドを使用します。 これはCalendarクラスのget()に相当します。

LocalDateTime d = LocalDateTime.now();
System.out.println(d.getYear());
System.out.println(d.getMonth());
System.out.println(d.getDayOfMonth());
System.out.println(d.getHour());
System.out.println(d.getMinute());
System.out.println(d.getSecond());
System.out.println(d.getNano());

時間の切り捨て - truncatedTo

ある特定の時間以降を切り捨てるにはtruncatedTo()を使います。

LocalDateTime.of(2016, 11, 10, 13, 30, 0).truncatedTo(ChronoUnit.HOURS); // 2016-11-10T13:00:00

他の日時クラスに変換 - to/at

LocalDateTimeクラスを別の日時クラスに変換するにはto/at系のメソッドを使用します。

LocalDateTime ldt = LocalDateTime.now();
Instant instant = ldt.toInstant(ZoneOffset.UTC);
ZonedDateTime zdt = ldt.atZone(ZoneId.systemDefault());
OffsetDateTime odt = ldt.atOffset(ZoneOffset.ofHours(9));

日付操作

加算・減算をするには、plus/minusメソッドを使用します。

LocalDateTime now = LocalDateTime.now();
LocalDateTime d1 = now.plusSeconds(1);
LocalDateTime d2 = now.plusDays(1);
LocalDateTime d3 = now.plusMonths(1);

月初/月末を求めるには、withメソッドの引数にTemporalAdjustersの値を指定します。

LocalDateTime now = LocalDateTime.now();
LocalDateTime beginning = now.with(TemporalAdjusters.firstDayOfMonth());
LocalDateTime end = now.with(TemporalAdjusters.lastDayOfMonth());

差を求めるには、ChronoUnitクラスのbetweenメソッドを使用します。 また、DurationやPeriodで取得することも可能です。

long diffMSec = ChronoUnit.MILLIS.between(d1, d2);
long diffDay = ChronoUnit.DAYS.between(d1, d2);
Duration duration = Duration.between(d1, d2);
Period period = Period.between(d1.toLocalDate(), d2.toLocalDate());

日付の比較をするには、isAfter/isBefore/isEqualを使用します。

boolean isAfter = d1.isAfter(d2);
boolean isBefore = d1.isBefore(d2);
boolean isEqual = d1.isEqual(d2);

ひとこと

今回の記事では、Java8で導入された日付関連の新APIのうち、LocalDateTimeクラスについてまとめてみました。 結構なボリュームになりましたが、これでもまだ一部です。 それだけかなりの機能があるということなのでしょうね。 LocalDateTimeクラスの使い方が大体分かれば、InstantクラスやZonedDateTimeクラスも似ていますのですぐ使いこなせるようになると思います。

APIのクラスに慣れてしまえば、DateクラスやCalendarクラスを使っていた時よりも、きっと日付操作が簡単にできるようになるでしょうね。 私も早く使い方をマスターしたいものです。