新卒ぶりくらいに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