Featured image of post 【Java8の日付操作】DateやCalendarを使うのを止めてLocalDateとLocalDateTimeを使って幸せになろう【初期化】

【Java8の日付操作】DateやCalendarを使うのを止めてLocalDateとLocalDateTimeを使って幸せになろう【初期化】

1130文字

Java8で日付操作周りが一新

以前はnew Date()Calendar.getInstance()を使って現在時刻を取得していたと思いますが、もともとのAPIがイケてない作りとなっていたため、日付操作周りで使いづらさ満点でした。

コード
//Java7以前
Date date = new Date();
System.out.println(date);
Calendar calendar = Calendar.getInstance();
System.out.println(calendar);

実行ログ
Mon Oct 01 20:04:40 JST 2018
java.util.GregorianCalendar[time=1538391880736,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Japan",offset=32400000,dstSavings=0,useDaylight=false,transitions=10,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2018,MONTH=9,WEEK_OF_YEAR=40,WEEK_OF_MONTH=1,DAY_OF_MONTH=1,DAY_OF_YEAR=274,DAY_OF_WEEK=2,DAY_OF_WEEK_IN_MONTH=1,AM_PM=1,HOUR=8,HOUR_OF_DAY=20,MINUTE=4,SECOND=40,MILLISECOND=736,ZONE_OFFSET=32400000,DST_OFFSET=0]

Dateクラスのメソッドである程度の日付操作は出来ていたのですが、Java8が出た現時点では現在は@Deprecated非推奨メソッドとなっています。

また、Calendarクラスについては@DeprecatedがついていないのでJava8でも利用出来ますがとても使いにくく、かっこ悪いです。笑

Calenderクラス
System.out.println(
          calendar.get(Calendar.YEAR) + "年"
        + (calendar.get(Calendar.MONTH) + 1) + "月"
        + calendar.get(Calendar.DAY_OF_MONTH) + "日 "
        + calendar.get(Calendar.HOUR_OF_DAY) + "時"
        + calendar.get(Calendar.MINUTE) + "分"
        + calendar.get(Calendar.SECOND) + "秒");

実行ログ
2018年10月1日 20時14分31秒

+ 1 と特にダサい。笑

なので、Java8以降の場合は上記の2つの方法を使わずに新しく追加されたAPIを利用するのが当たり前となっています。

日付操作API

LocalDate

java.time.LocalDate日付操作をする際に使うクラスとなっております。

LocalDateTime
LocalDate ld = LocalDate.now();
System.out.println(ld);

実行ログ
2018-10-01

時間を指定してのインスタンスの作成も簡単に出来ます。

LocalDateTime
LocalDate ld = LocalDate.of( 2018, 10, 1 );
System.out.println(ld);

実行ログ
2018-10-01

生成したインスタンスに対する操作が直感的かつシンプルにかけるので綺麗ですね♪

各種操作メソッド例
ld.plusYears(1);
ld.plusMonths(1);
ld.plusDays(1);
ld.plusWeeks(1);
ld.minusYears(1);
ld.minusMonths(1);
ld.minusDays(1);
ld.minusWeeks(1);

文字列日付からのパースもとても簡単です。
この便利さはかなり衝撃的です。

LocalDateTime
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss", Locale.JAPANESE);
LocalDate ld = LocalDate.parse("2018/10/01", dtf);
System.out.println( ld );

実行ログ
2018-10-01

LocalDateTime

java.time.LocalDateTime日時操作をする際に使うクラスとなっております。

LocalDateTime
LocalDateTime ldt = LocalDateTime.now();
System.out.println(ldt);

実行ログ
2018-10-01T20:21:13.002

LocalDateと同様に時間を指定してのインスタンスの作成も簡単に出来ます。

LocalDateTime
LocalDateTime ldt = LocalDateTime.of(2018, 10, 1, 20, 59, 59);
System.out.println(ldt);

実行ログ
2018-10-01T20:59:59

こちらも生成したインスタンスに対する操作が直感的かつシンプルにかけます。
分かりやすい。。。!

各種操作メソッド例
ldt.plusYears(1);
ldt.plusMonths(1);
ldt.plusDays(1);
ldt.plusHours(1);
ldt.plusMinutes(1);
ldt.plusSeconds(1);
ldt.minusYears(1);
ldt.minusMonths(1);
ldt.minusDays(1);
ldt.minusHours(1);
ldt.minusMinutes(1);
ldt.minusSeconds(1);

こちらも文字列日時からのパースはお手の物です♪

LocalDateTime
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss", Locale.JAPANESE);
LocalDateTime ldt = LocalDateTime.parse("2018/10/01 20:53:15", dtf);
System.out.println( ldt );

実行ログ
2018-10-01T20:53:15

終わりに

以上のように、今まで複雑だった日付周りの操作がとても簡潔になります。
簡潔になるということはバグ率の低下や可読性の向上にも繋がります。

また、今回紹介しなかった便利なメソッドは他にもありますので、また改めて記事にまとめようかと思います♪

今からJavaで開発をする際には少なくともJava7以前で進めることはないと思うので、是非この新しい日付APIを使ってみてください。