中安拓也のブログ

プログラミングについて書くブログ

【Java8】年月日の計算が簡単にできる Date and Time APIについて

新卒ぶりくらいにJavaを触ったら、日時の計算が楽にできるようになってて驚いた

この記事について

Java8で導入された Date and Time API による、日時の計算についてのメモ

Date and Time API

Date and Time APIでは、Java8以前の日付クラス(java.util.Date, java.util.Calender)と比べて、下記の特徴・メリットがあります。

  • 日付・時間・日時をそれぞれ別クラスで扱っている(不要な情報を持たなくてよい)
  • 年月日の計算が楽

日付・時間・日時をそれぞれ別クラスで扱う

Date and Time APIでは、日付・時間・日時を扱うクラスが次のように3つに別れています。

  • 日付
    • java.time.LocalDate クラス
  • 時間
    • java.time.LocalTime クラス
  • 日時
    • java.time.LocalDateTime クラス

コード

実際にDate and Time APIを使って、日時処理をしていく

現在の日付、時間、日時の取得

// 日付
LocalDate date = LocalDate.now();
// 出力: 2018-08-26
System.out.println(date);

// 時間
LocalTime time = LocalTime.now();
// 出力: 14:06:44.359369
System.out.println(time);

// 日時
LocalDateTime dateTime = LocalDateTime.now();
// 出力: 2018-08-26T14:06:44.359400
System.out.println(dateTime);

実行結果

2018-08-26
14:06:44.359369
2018-08-26T14:06:44.359400

StringからLocalDateに変換

文字列をLocalDate型に変換する

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;

public class TestDate {
    public static void main(String... args) {

        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd");

        String text = "2017/03/08";

        // StringからLocalDateに変換
        LocalDate localDate = LocalDate.parse(text, formatter);

        // 出力: 2017-03-08
        System.out.println(localDate);
    }
}

実行結果

2017-03-08

LocalDateからStringに変換

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;

public class TestDate {
    public static void main(String... args) {

        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日");

        // 現在の日付を取得
        LocalDate localDate = LocalDate.now();

        // StringからLocalDateに変換
        String formattedString = localDate.format(formatter);
        // 出力: 2018年08月26日
        System.out.println(formattedString);
    }
}

実行結果

2018年08月26日

生年月日から年齢を計算する

生年月日から、その人の年齢を計算する

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;

public class TestDate {
    public static void main(String... args) {

        // 生年月日
        String birthdate = "1989/10/16";

        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd");

        // 生年月日を表す文字列から、LocalDateを生成
        LocalDate localBirdhdate = LocalDate.parse(birthdate, formatter);

        // 現在の日付を取得
        LocalDate nowDate = LocalDate.now();

        // 現在と生年月日の差分を年単位で算出することによって、年齢を計算する
        long age = ChronoUnit.YEARS.between(localBirdhdate, nowDate);

        // 年齢: 28
        System.out.println("年齢: " + age);
    }
}

実行結果

年齢: 28

年月日の計算

日単位の加算を行ったり、差分を日・時間・分 単位で出したりなど

import java.time.LocalDateTime;
import java.time.temporal.ChronoUnit;

public class TestDate {
    public static void main(String... args) {

        // 現在の日時を取得
        LocalDateTime nowLocalDate = LocalDateTime.now();

        // 現在の日時の1日後を取得
        LocalDateTime nextLocalDate = nowLocalDate.plusDays(1);

        // 今日と明日の差分を日単位で取得
        long days = ChronoUnit.DAYS.between(nowLocalDate, nextLocalDate);

        // 今日と明日の差分を時間単位で取得
        long hours = ChronoUnit.HOURS.between(nowLocalDate, nextLocalDate);

        // 今日と明日の差分を分単位で取得
        long minutes = ChronoUnit.MINUTES.between(nowLocalDate, nextLocalDate);
        
        System.out.println("現在の日付: " + nowLocalDate);
        System.out.println("明日の日付: " + nextLocalDate);
        System.out.println("差分(日): " + days);
        System.out.println("差分(時間): " + hours);
        System.out.println("差分(分): " + minutes);

    }
}

実行結果

現在の日付: 2018-08-26T17:37:26.337370
明日の日付: 2018-08-27T17:37:26.337370
差分(日): 1
差分(時間): 24
差分(分): 1440

参考サイト

Javaで2つの期間より差を検出する。 - m_shige1979のささやかな抵抗と欲望の日々