2018.7.5

日付の取得やフォーマット、比較などの処理のまとめ(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では新しく日時用のクラスが追加されています。

Javaで日時を扱う(Java8)

最後に一言

仕事で扱っているのは未だに6とかだったりしますが、ラムダ式や(8から)、ローカル変数の型にvarとか(10から)いい加減に使いたい...

参考リンク

Java】関連記事