当サイトは、アフィリエイト広告を利用しています
仕事でDBから取得した日付データを集する機会が多いので
java8ではLocalDateを使用して
日付データを操作する方法をまとめておく。
javaにおける日付を操作する場合基本的には下記のロジックになる
文字列からLocalDateクラスのオブジェクトを生成
生成したオブジェクトのメソッドを使って日付操作を行う
LocalDateクラスのメソッド使って文字列にformatする
日付データ(yyyyMMdd)を操作するにはLocalDateクラスを使う。
LocalDateクラスを使用するためには、編集元となる文字列のデータはyyyyMMddのddまで必要になる
※後述のDateTimeFormatterで"yyyyyMM"の文字列をparseしてオブジェクトを作成しようとしても失敗する。
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を作成して変換する
変換する文字列の解析パターンをオプションを使って指定している。
※オプション指定をしない、または解析パターンと違う文字列が来た場合
実行時エラーになる
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
Java - Stringを解析してLocalDateに変換する方法
文字列の解析パターンがオプションにない場合は、DateTimeFormatterで解析パターンを
作成してから変換してやる必要がある
String→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日";//解析パターンを作成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));}}
実際に動かしてみる
LocalDateオブジェクトをStringに変換する
LocalDateオブジェクトのformatメソッド + 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);//任意の変換後文字列パターン(yyyy/MM/dd形式の文字列にする)DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy/MM/dd");//文字列に変換System.out.println(date.format(dateTimeFormatter));}}// 実行結果// 2019-01-10// 2019/01/10
インラインで書くこともできる
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オブジェクト作成から日付操作、文字列変換までの流れを動かしてみる
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);}}
動作確認してみる
LocalDateクラスを使うことで簡単にjavaで日付操作することができる。
今までは割と日付操作は苦手だったが、これを覚えていれば簡単にできそう
下記を参考にさせていただきました。
日付文字列を任意のフォーマットに変更する関数を作っておけば便利。
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;}