当サイトは、アフィリエイト広告を利用しています

【java8】LocalDateで日付を操作する

作成日:2022月07月14日
更新日:2022年11月09日

仕事でDBから取得した日付データを集する機会が多いので
java8ではLocalDateを使用して
日付データを操作する方法をまとめておく。

処理ロジック

javaにおける日付を操作する場合基本的には下記のロジックになる

オブジェクトの生成

文字列からLocalDateクラスのオブジェクトを生成

オブジェクトで日付データ編集

生成したオブジェクトのメソッドを使って日付操作を行う

オブジェクトから文字列に戻す

LocalDateクラスのメソッド使って文字列にformatする

LocalDateクラスで日付データを編集する

日付データ(yyyyMMdd)を操作するにはLocalDateクラスを使う。
LocalDateクラスを使用するためには、編集元となる文字列のデータはyyyyMMddのddまで必要になる
※後述のDateTimeFormatterで"yyyyyMM"の文字列をparseしてオブジェクトを作成しようとしても失敗する。

LocalDateクラスオブジェクトを生成する

LocalDateクラスオブジェクトの生成には大きく二つのパターンがある

LocalDateクラスで直接生成する

LocalDateクラスのメソッドを使って直接、生成するパターン

LocalDateオブジェクト生成
import java.util.*;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
public class Main {
public static void main(String[] args) throws Exception {
// 現在日付
LocalDate date1 = LocalDate.now();
// 年月日を全て数値で指定
LocalDate date2 = LocalDate.of(2013, 12, 31);
System.out.println(date1);
System.out.println(date2);
}
}
// 実行結果
// 2022-07-14
// 2013-12-31
  • 現在日を生成する場合や生成する日付が決まっている場合はこっちを使う

文字列から生成する

日付文字列を解析してLocalDateオブジェクトの作成するパターン。
LocalDateとDateTimeFormatterライブラリを利用して
文字列の日付をLocalDateオブジェクトに変換する
一般的な日付は、定数として定義されているものを使用し
そうでない場合Fomatterを作成して変換する

DateTimeFormatterのオプション(定数)を使って変換する

変換する文字列の解析パターンをオプションを使って指定している。
※オプション指定をしない、または解析パターンと違う文字列が来た場合
実行時エラーになる

文字列から生成(option指定)
import java.util.*;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
public class Main {
public static void main(String[] args) throws Exception {
String string = "2019-01-10";
LocalDate date = LocalDate.parse(string, DateTimeFormatter.ISO_DATE);
System.out.println(date);
}
}
// 実行結果
//2019-01-10
  • DateTimeFormatter.ISO_DATEは"yyyy-mm-dd"を定数として宣言したもの(オプション)
  • 変換する文字列が"2019/01/10"などのparseの第二引数で設定した解析パターンと違うものが来た場合はエラー

参考

Java - Stringを解析してLocalDateに変換する方法

formatを独自で定義して変換する

文字列の解析パターンがオプションにない場合は、DateTimeFormatterで解析パターンを
作成してから変換してやる必要がある
String→DateTimeFormatter→LocalDateという流れで変換する。

文字列から生成(format指定)
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
public class Main {
public static void main(String args[]) {
//オプションにない文字列パターン
String string = "2019年 01月 10日";
//解析パターンを作成
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy年 MM月 dd日");
//変換
LocalDate date = LocalDate.parse(string, formatter);
System.out.println(date);
// 文字列変換(format指定)して出力
System.out.println(date.format(formatter));
}
}
// 実行結果
// 2019-01-10
// 2019年 01月 10日

短縮系

DateTimeFormatterをインラインで実行することもできる

文字列から生成(短縮)
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
public class Main {
public static void main(String args[]) {
String string = "2019年 01月 10日";
LocalDate date = LocalDate.parse(string, DateTimeFormatter.ofPattern("yyyy年 MM月 dd日"));
System.out.println(date);
}
}
// 実行結果
// 2019-01-10

日付データの編集方法

年・月・日・曜日の個別取得

LocalDateクラスに変換後は同オブジェクトのメソッドを使って年月日を取り出すことができる

年月日取得
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
public class Main {
public static void main(String args[]) {
String string = "2019年 01月 10日";
LocalDate date = LocalDate.parse(string, DateTimeFormatter.ofPattern("yyyy年 MM月 dd日"));
System.out.println(" 年:" + date.getYear());
System.out.println(" 月:" + date.getMonthValue());
System.out.println(" 日:" + date.getDayOfMonth());
System.out.println(" 曜日:" + date.getDayOfWeek());
}
}
//実行結果
//年:2019
//月:1
//日:10
//曜日:THURSDAY

加減算

LocalDateクラスのメソッドを使って日付の加減算を行うことができる。
日付編集を行いたい場合はLocalDateオブジェクトに変換してから行う。

日付編集
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
public class Main {
public static void main(String args[]) {
String string = "2019年 01月 10日";
LocalDate date = LocalDate.parse(string, DateTimeFormatter.ofPattern("yyyy年 MM月 dd日"));
// 年
System.out.println(date + "の1年後: " + date.plusYears(1));
System.out.println(date + "の10年後: " + date.plusYears(10));
System.out.println(date + "の1年前: " + date.minusYears(1));
System.out.println(date + "の10年前: " + date.minusYears(10));
System.out.println("--------------------------");
System.out.println("\n");
// 月
System.out.println(date + "の1月後: " + date.plusMonths(1));
System.out.println(date + "の10月後: " + date.plusMonths(10));
System.out.println(date + "の1月前: " + date.minusMonths(1));
System.out.println(date + "の10月前: " + date.minusMonths(10));
System.out.println("--------------------------");
System.out.println("\n");
// 日
System.out.println(date + "の1日後: " + date.plusDays(1));
System.out.println(date + "の10日後: " + date.plusDays(10));
System.out.println(date + "の1日前: " + date.minusDays(1));
System.out.println(date + "の10日前: " + date.minusDays(10));
}
}

実際に動かしてみる

【java】LocalDateクラスで日付操作

LocalDateの文字列変換

LocalDateオブジェクトをStringに変換する
LocalDateオブジェクトのformatメソッド + DateTimeFormatter
で変換することができる。

LocalDateの文字列変換
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
public class Main {
public static void main(String args[]) {
String string = "2019年 01月 10日";
LocalDate date = LocalDate.parse(string, DateTimeFormatter.ofPattern("yyyy年 MM月 dd日"));
System.out.println(date);
//任意の変換後文字列パターン(yyyy/MM/dd形式の文字列にする)
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy/MM/dd");
//文字列に変換
System.out.println(date.format(dateTimeFormatter));
}
}
// 実行結果
// 2019-01-10
// 2019/01/10

インラインで書くこともできる

LocalDateの文字列変換(インライン)
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
public class Main {
public static void main(String args[]) {
String string = "2019年 01月 10日";
LocalDate date = LocalDate.parse(string, DateTimeFormatter.ofPattern("yyyy年 MM月 dd日"));
System.out.println(date);
//文字列に変換
System.out.println(date.format(DateTimeFormatter.ofPattern("yyyy/MM/dd")));
}
}
// 実行結果
// 2019-01-10
// 2019/01/10

まとめ

最後にLocalDateオブジェクト作成から日付操作、文字列変換までの流れを動かしてみる

java8で日付を扱う
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
public class Main {
public static void main(String args[]) {
// 順番に実行する
String string1 = "2019年 01月 10日";
// LocalDateオブジェクト作成
LocalDate date = LocalDate.parse(string1, DateTimeFormatter.ofPattern("yyyy年 MM月 dd日"));
// 日付編集
date = date.plusYears(1);
date = date.plusMonths(1);
date = date.plusDays(1);
// 文字列変換
System.out.println(date.format(DateTimeFormatter.ofPattern("yyyy/MM/dd")));
// 1行でまとめて実行するパターン
String string2 = "2022年 05月 10日";
String dateEditString = LocalDate.parse(string2, DateTimeFormatter.ofPattern("yyyy年 MM月 dd日"))
.plusYears(1)
.plusMonths(1)
.plusDays(1)
.format(DateTimeFormatter.ofPattern("yyyy:MM:dd"));
System.out.println(dateEditString);
}
}

動作確認してみる

【java8】LocalDateで日付操作の流れ

LocalDateクラスを使うことで簡単にjavaで日付操作することができる。
今までは割と日付操作は苦手だったが、これを覚えていれば簡単にできそう

参考

下記を参考にさせていただきました。

おまけ

日付文字列を任意のフォーマットに変更する関数を作っておけば便利。

convertDate
static String convertDate(String dateStr,String analyse,String format){
String result = null;
//引数の日付文字列を引数の解析パターンでLocalDateオブジェクトに変換
LocalDate date = LocalDate.parse(dateStr,DateTimeFormatter.ofPattern(analyse));
//localDateオブジェクトを引数のフォーマットのも日付文字列に変換
result = date.format(DateTimeFormatter.ofPattern(format));
return result;
}

新着記事

タグ別一覧
top