日付の取得やフォーマット、比較などの処理のまとめ(Calendar、Date)
久しぶりにJavaを扱う時、いつも戸惑うのが日付の取得やフォーマットに関する処理です。CalendarやDateといった似たようなクラスが2つあるのがそもそもの原因の気がします。
Calendarは計算用で、Dateは表示(フォーマット)用。
比較や差分の取得はどちらでもOKです。
目次
- 現在の日時の取得
- 日付のフォーマット
- 指定した日付の設定
- 日付の比較
- 2つの日付の差分を取得する
- Java8の場合
- 最後に一言
- 参考リンク
現在の日時の取得
Calendarの場合
Calendar cal = Calendar.getInstance();
System.out.println("YEAR :" + cal.get(Calendar.YEAR));
System.out.println("MONTH :" + cal.get(Calendar.MONTH) + 1);
System.out.println("DATE :" + cal.get(Calendar.DATE));
System.out.println("HOUR :" + cal.get(Calendar.HOUR));
System.out.println("MINUTE :" + cal.get(Calendar.MINUTE));
System.out.println("SECOND :" + cal.get(Calendar.SECOND));
System.out.println("MILLISECOND:" + cal.get(Calendar.MILLISECOND));
// 実行結果
// YEAR :2018
// MONTH :61
// DATE :5
// HOUR :8
// MINUTE :19
// SECOND :3
// MILLISECOND:963
Dateの場合
Date dt = new Date();
System.out.println(dt);
// 実行結果
// Thu Jul 05 20:19:03 JST 2018
Date型で年月日などを取得する場合、以下ようにフォーマットで取得します。
日付のフォーマット
Date dt = new Date();
System.out.println(new SimpleDateFormat("yyyy/MM/dd hh:mm:ss:SSS").format(dt));
// 実行結果
// 2018/07/05 08:19:03:979
Calendarでフォーマットを行う場合は、getDate()を使います。
Calendar cal = Calendar.getInstance();
System.out.println(new SimpleDateFormat("yyyy/MM/dd hh:mm:ss:SSS").format(cal.getTime()));
// 実行結果
// 2018/07/05 08:19:03:979
指定した日付の設定
日付の設定に関する処理はCalendarで行います。
パターン1
Calendar cal = Calendar.getInstance();
cal.set(2017, 11, 31, 23, 1, 59);
System.out.println(new SimpleDateFormat("yyyy/MM/dd hh:mm:ss:SSS").format(cal.getTime()));
// 実行結果
// 2017/12/31 11:01:59:979
パターン2
Calendar cal = Calendar.getInstance();
cal.set(Calendar.YEAR, 2016);
cal.set(Calendar.MONTH, 0);
cal.set(Calendar.DATE, 1);
cal.set(Calendar.HOUR, 13);
cal.set(Calendar.MINUTE, 30);
cal.set(Calendar.SECOND, 59);
cal.set(Calendar.MILLISECOND, 987);
System.out.println(new SimpleDateFormat("yyyy/MM/dd hh:mm:ss:SSS").format(cal.getTime()));
// 実行結果
// 2016/01/02 01:30:59:987
日付の比較
日付の比較を行う場合、compareTo()、before()、after()メソッドを使います。
以下はcompareTo()を使った例。
日付が同じ場合
Calendar cal1 = Calendar.getInstance();
Calendar cal2 = (Calendar)cal1.clone();
int res = cal1.compareTo(cal2);
System.out.println("result:" + res);
// 実行結果
// result:0
引数の日付が古い場合
Calendar cal1 = Calendar.getInstance();
Calendar cal2 = (Calendar)cal1.clone();
cal2.set(Calendar.HOUR, cal2.get(Calendar.HOUR) - 1);
int res = cal1.compareTo(cal2);
System.out.println("result:" + res);
// 実行結果
// result:1
引数の日付が新しい場合
Calendar cal1 = Calendar.getInstance();
Calendar cal2 = (Calendar)cal1.clone();
cal2.set(Calendar.SECOND, cal2.get(Calendar.SECOND) + 1);
int res = cal1.compareTo(cal2);
System.out.println("result:" + res);
// 実行結果
// result:-1
2つの日付の差分を取得する
差分を求めるには日付をlong値に変換してから行います。
Calendar cal1 = Calendar.getInstance();
Calendar cal2 = (Calendar)cal1.clone();
cal2.set(Calendar.DATE, cal2.get(Calendar.DATE) - 10);
long diff = cal1.getTime().getTime() - cal2.getTime().getTime();
System.out.println("ミリ秒:" + diff);
System.out.println("秒 :" + diff / 1000);
System.out.println("分 :" + diff / 1000 / 60);
System.out.println("時 :" + diff / 1000 / 60 / 60);
System.out.println("日 :" + diff / 1000 / 60 / 60 / 24);
// 実行結果
// ミリ秒:864000000
// 秒 :864000
// 分 :14400
// 時 :240
// 日 :10
Java8の場合
上記はJavaのバージョンが6や7の場合の処理。8では新しく日時用のクラスが追加されています。
最後に一言
仕事で扱っているのは未だに6とかだったりしますが、ラムダ式や(8から)、ローカル変数の型にvarとか(10から)いい加減に使いたい...