Javaの道 Javaに関する
 ニュースJava基本Servlet・JSPオープンソースFAQ掲示板
Javaの道 > FAQ > Java基本 −2.日付・時刻
(1). 日付・時刻の操作
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

【参考】Javaの道:日付・時刻(2.Calendarクラス)
(2). 日付・時刻の設定
任意の日付・時刻を設定する際は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日が設定されています。

【参考】Javaの道:日付・時刻(2.Calendarクラス)
(3). 日付・時刻の加算・減算

日付・時刻の加算・減算を行う際は、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日が設定されています。

(4). 日付・時刻の比較
日付・時刻の比較を行う場合は、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より大きい値が返されます。

(5). 月の末日を取得する方法
月の末日を取得する場合、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

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

日付・時刻の表示フォーマットを変更する際は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日

【参考】Javaの道:日付・時刻(3.SimpleDateFormatクラス)
(7). 日付・時刻の妥当性をチェックする方法

日付・時刻の妥当性をチェックするためには、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
存在しない日付です。

(8). 文字列を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("変換できないフォーマットです。");
    }    

  }
}



このページのトップへ
 ニュースJava基本Servlet・JSPオープンソースFAQ掲示板
Javaの道_CopyrightJavaの道