Javaに関する様々な情報をご紹介します。

2日付・時刻

Javaに関する様々な情報をご紹介します。

日付・時刻

日付・時刻の操作

Javaで日付・時刻の操作を行う場合は、Calendarクラスを使用します。日付の加算、減算、比較など様々な機能を持っています。Calendarクラスを使用する際は、java.uti.Calendarクラスをインポートする必要があります。

//java.util.Calendarクラスをインポートします。
import java.util.Calendar;

class Test {
    public static void main(String[] args) {
        //Calendarクラスのオブジェクトcal1を生成しています。
        Calendar cal1 = Calendar.getInstance();

        //getTimeメソッドで日時を取得し表示しています。
        //デフォルトの設定では実行時点の日時が取得されます。
        System.out.println(cal1.getTime());
    }
}
C:\Java\source\TEST>javac Test.java
 
C:\Java\source\TEST>java Test
Sun Apr 13 15:20:24 JST 2008

日付・時刻の設定

任意の日付・時刻を設定する際はsetメソッドを使用します。月を設定する際は、月は0~11の間で表現されるので設定したい月の-1の値を設定します。

//java.util.Calendarクラスをインポートします。
import java.util.Calendar;

class Test {
    public static void main(String[] args) {
        //Calendarクラスのオブジェクトcal1を生成しています。
        Calendar cal1 = Calendar.getInstance();

        //setメソッドで日時に2100年10月5日を設定しています。
        cal1.set(2100, 9, 5);

        //getTimeメソッドで日時を取得し表示しています。
        System.out.println(cal1.getTime());
    }
}
C:\Java\source\TEST>javac Test.java
                                             
C:\Java\source\TEST>java Test
Tue Oct 05 16:20:03 JST 2100  #2100年10月5日が設定されています。

日付・時刻の加算・減算

日付・時刻の加算・減算を行う際は、addメソッドを使用します。addメソッドの第1引数には加減算を行いたい日付・時刻のフィールド(YEAR、DATEなど)、第2引数には加減算を行う値を指定します。加算を行う場合は、1、2などプラスの値を、減算を行いたい場合は-1、-2などマイナスの値を指定します。
フィールドの詳細については、Javaの道:日付・時刻(2.Calendarクラス) もしくはAPIリファレンスを参照してください。

//java.util.Calendarクラスをインポートします。
import java.util.Calendar;

class Test {
    public static void main(String[] args) {
        //Calendarクラスのオブジェクトcal1を生成しています。
        Calendar cal1 = Calendar.getInstance();

        //setメソッドで日時に2100年3月1日を設定しています。
        cal1.set(2100, 2, 1);

        //2100年3月1日から1日減算しています。
        cal1.add(Calendar.DATE, -1);
        System.out.println(cal1.getTime());

        //上記で1日減算した日付に、1日加算し2100年3月1日に戻しています。
        cal1.add(Calendar.DATE, 1);
        System.out.println(cal1.getTime());
    }
}
C:\Java\source\TEST>javac Test.java

C:\Java\source\TEST>java Test
Sun Feb 28 16:36:43 JST 2100  # 1日減算し、2100年2月28日が設定されています。
Mon Mar 01 16:36:43 JST 2100  # 1日加算し、2100年3月1日が設定されています。

日付・時刻の比較

日付・時刻の比較を行う場合は、compareToメソッドを使用します。比較対象がオブジェクトの日時より未来の場合は0未満の値を、過去の場合は0より大きい値を、同じ場合は0を返します。

//java.util.Calendarクラスをインポートします。
import java.util.Calendar;

class Test {
    public static void main(String[] args) {
        //Calendarクラスのオブジェクトcal1、cal2、cal3を生成しています。
        Calendar cal1 = Calendar.getInstance();
        Calendar cal2 = Calendar.getInstance();
        Calendar cal3 = Calendar.getInstance();

        //オブジェクトcal1に2100年3月1日を設定しています。
        cal1.set(2100, 2, 1);

        //オブジェクトcal2に2100年4月1日を設定しています。
        cal2.set(2100, 3, 1);

        //オブジェクトcal3に2100年2月1日を設定しています。
        cal3.set(2100, 1, 1);

        //日時を比較しています。
        System.out.println("未来日を比較:" + cal1.compareTo(cal2));
        System.out.println("過去日を比較:" + cal1.compareTo(cal3));
    }
}
C:\Java\source\TEST>javac Test.java

C:\Java\source\TEST>java Test
未来日を比較:-1  # 未来日のため、0未満の値が返されます。
過去日を比較:1  # 過去日のため、0より大きい値が返されます。

月の末日を取得する方法

月の末日を取得する場合、getActualMaximumメソッドを使用します。getActualMaximumメソッドは、引数に指定されたフィールドが取りうる最大値を返します。そのため、引数に月の日を表すDATEフィールドを指定することにより、月の末日を取得します。

//java.util.Calendarクラスをインポートします。
import java.util.Calendar;

class Test {
    public static void main(String[] args) {
        //Calendarクラスのオブジェクトcal1を生成しています。
        Calendar cal1 = Calendar.getInstance();

        //setメソッドで日時に2008年2月1日を設定しています。
        cal1.set(2008, 1, 1);

        //2008年2月の末日を取得し表示しています。
        System.out.println("2008年2月の末日:" +
        cal1.getActualMaximum(Calendar.DATE));
    }
}
C:\Java\source\TEST>javac Test.java

C:\Java\source\TEST>java Test
2008年2月の末日:29

日付・時刻の表示フォーマット変更

日付・時刻の表示フォーマットを変更する際はSimpleDateFormatクラスを使用します。コンストラクタの引数に表示フォーマットを指定してSimpleDateFormatオブジェクトを生成し、formatメソッドで日付・時刻を該当のフォーマットに変更します。
表示フォーマットは予め用意されているパターン文字で指定します。yyyyは4桁の年をmmは月を表すなど様々なパターン文字が用意されています。 フォーマット内に任意の文字列を入れたい場合は、任意の文字列を' 'で囲みます。(例:yyyy'年'は、2000年を表します。)

パターン文字の詳細については、Javaの道:日付・時刻(3.SimpleDateFormatクラス)もしくはAPIリファレンスを参照してください。

import java.util.Date;
import java.text.SimpleDateFormat;

class Test {
    public static void main(String[] args) {
        Date date1 = new Date();

        //引数に表示フォーマットを指定して
        //SimpleDateFormatオブジェクトを生成しています。
        SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy'年'MM'月'dd'日'");
        //formatメソッドで該当のフォーマットに変更しています。
        System.out.println(sdf1.format(date1));
    }
}
C:\Java\source\TEST>javac Test.java

C:\Java\source\TEST>java Test
2008年05月06日

日付・時刻の妥当性をチェックする方法

日付・時刻の妥当性をチェックするためには、Calendarクラスや、SimpleDateFormatクラスに用意されているsetLenientメソッドを使用します。デフォルトの設定では、日付・時刻の妥当性チェックは行われませんが、setLenientメソッドで"false"を設定することで妥当性チェックが行われるようになります。
存在しない日付・時刻が設定されている場合、CalendarクラスではgetTimeメソッド等(SimpleDateFormatクラスではparseメソッド等)を使用した際に例外IllegalArgumentExceptionがスローされます。

import java.util.Calendar;

class Test {
    public static void main(String[] args) {
        //Calendarクラスのオブジェクトcal1を生成しています。
        Calendar cal1 = Calendar.getInstance();

        //setLenientメソッドでfalseを設定しています。
        cal1.setLenient(false);

        //setメソッドで存在しない日付2008年2月30日を設定しています。
        cal1.set(2008, 1, 30);

        try {
            cal1.getTime();
        //存在しない日付のため例外がスローされます。
        } catch (IllegalArgumentException e) {
            System.out.println("存在しない日付です。");
        }
    }
}
C:\Java\source\TEST>javac Test.java

C:\Java\source\TEST>java Test
存在しない日付です。

文字列をDate型に変換

文字列をDate型に変換する際はSimpleDateFormatクラスのparseメソッドを使用します。変換したい文字列のフォーマットを指定して、SimpleDateFormatクラスのオブジェクトを生成します。parseメソッドで文字列をDate型に変換します。
フォーマットを指定して、SimpleDateFormatクラスのオブジェクトを生成する方法は、Javaの道:日付・時刻(3.SimpleDateFormatクラス)を参照してください。

import java.util.Date;
import java.text.SimpleDateFormat;
import java.text.ParseException;

class Test {
    public static void main(String[] args) {

        //フォーマットを指定してSimpleDateFormatクラスのオブジェクトを
        //生成しています。
        SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy'年'MM'月'dd'日'");

        //変換する文字列を生成しています。
        String str1 = new String("2008年10月1日");

        try {
            //parseメソッドでDate型に変換します。
            Date date1 = sdf1.parse(str1);
        //変換できない場合例外がスローされます。
        } catch (ParseException e) {
            System.out.println("変換できないフォーマットです。");
        }

    }
}

2日付・時刻