投稿日:
2018年10月1日
最終更新日:
【Java8の日付操作】DateやCalendarを使うのを止めてLocalDateとLocalDateTimeを使って幸せになろう【初期化】
YouTubeも見てね♪
ねこじゃすり
猫を魅了する魔法の装備品!
Anker PowerCor
旅行には必須の大容量モバイルバッテリー!
【最新機種】GoPro hero11 Black
最新機種でVlogの思い出を撮影しよう!
モンスターエナジー 355ml×24本 [エナジードリンク]
脳を活性化させるにはこれ!
Bauhutte ( バウヒュッテ ) 昇降式 L字デスク ブラック BHD-670H-BK
メインデスクの横に置くのにぴったりなおしゃれな可動式ラック!
BANDAI SPIRITS ULTIMAGEAR 遊戯王 千年パズル 1/1スケール
もう一人の僕を呼び覚ませ!!
MOFT X 【新型 ミニマム版】 iPhone対応 スマホスタンド
Amazon一番人気のスマホスタンド!カード類も収納出来てかさ張らないのでオススメです!
Java8で日付操作周りが一新
以前はnew Date()
やCalendar.getInstance()
を使って現在時刻を取得していたと思いますが、もともとのAPIがイケてない作りとなっていたため、日付操作周りで使いづらさ満点でした。
1
2
3
4
5
|
//Java7以前
Date date = new Date();
System.out.println(date);
Calendar calendar = Calendar.getInstance();
System.out.println(calendar);
|
1
2
|
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でも利用出来ますがとても使いにくく、かっこ悪いです。笑
1
2
3
4
5
6
7
|
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) + "秒");
|
1 |
2018年10月1日 20時14分31秒 |
+ 1
と特にダサい。笑
なので、Java8以降の場合は上記の2つの方法を使わずに新しく追加されたAPIを利用するのが当たり前となっています。
日付操作API
LocalDate
java.time.LocalDate
は日付操作をする際に使うクラスとなっております。
1
2
|
LocalDate ld = LocalDate.now();
System.out.println(ld);
|
1 |
2018-10-01
|
時間を指定してのインスタンスの作成も簡単に出来ます。
1
2
|
LocalDate ld = LocalDate.of( 2018, 10, 1 );
System.out.println(ld);
|
1 |
2018-10-01
|
生成したインスタンスに対する操作が直感的かつシンプルにかけるので綺麗ですね♪
1
2
3
4
5
6
7
8
|
ld.plusYears(1);
ld.plusMonths(1);
ld.plusDays(1);
ld.plusWeeks(1);
ld.minusYears(1);
ld.minusMonths(1);
ld.minusDays(1);
ld.minusWeeks(1);
|
文字列日付からのパースもとても簡単です。
この便利さはかなり衝撃的です。
1
2
3
|
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss", Locale.JAPANESE);
LocalDate ld = LocalDate.parse("2018/10/01", dtf);
System.out.println( ld );
|
1 |
2018-10-01
|
LocalDateTime
java.time.LocalDateTime
は日時操作をする際に使うクラスとなっております。
1
2
|
LocalDateTime ldt = LocalDateTime.now();
System.out.println(ldt);
|
1 |
2018-10-01T20:21:13.002
|
LocalDateと同様に時間を指定してのインスタンスの作成も簡単に出来ます。
1
2
|
LocalDateTime ldt = LocalDateTime.of(2018, 10, 1, 20, 59, 59);
System.out.println(ldt);
|
1 |
2018-10-01T20:59:59
|
こちらも生成したインスタンスに対する操作が直感的かつシンプルにかけます。
分かりやすい。。。!
1
2
3
4
5
6
7
8
9
10
11
12
|
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);
|
こちらも文字列日時からのパースはお手の物です♪
1
2
3
|
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 );
|
1 |
2018-10-01T20:53:15
|
終わりに
以上のように、今まで複雑だった日付周りの操作がとても簡潔になります。
簡潔になるということはバグ率の低下や可読性の向上にも繋がります。
また、今回紹介しなかった便利なメソッドは他にもありますので、また改めて記事にまとめようかと思います♪
今からJavaで開発をする際には少なくともJava7以前で進めることはないと思うので、是非この新しい日付APIを使ってみてください。