Calendar
日本語 | カレンダー |
英語 | calendar |
ふりがな | かれんだー |
フリガナ | カレンダー |
J2SEに含まれるクラスのひとつ。パッケージも含めたクラス名はjava.util.Calendar。
日時を格納するためのクラス。日時を格納し、基本的な処理がひととおり行えるメソッドを持つ。
コンストラクタはprotectedのため直接呼び出すことはできない。getInstance()メソッドがstaticメソッドとして用意されており、このメソッドを呼ぶことでCalendarクラスのインスタンスを作成できる。また、このインスタンスには現在日時が格納されている。
ただし、正確に言うと「Calendarクラスのインスタンス」ではなく「Calendarクラスのサブクラスのインスタンス」である。詳しくは「GregorianCalendar」の項目を参照。
特定日時のセットにはset()メソッドを使用する。あらかじめclear()メソッドを呼び出しておくとエポックつまり「1970/01/01 00:00:00.000」にリセットしてくれるため、その後に希望の日時をセットするといいだろう。
年、月、日等を個別に取得する場合にはget()メソッドを使用する。
いずれも、項目を指定する場合には「Calendar.YEAR」等のstatic finalなフィールドを用いる。
また、月は-1された値となることに注意。これはプログラミングにおける慣習のようなもので、1月が0、12月が11となる。月を指定する際は、「Calendar.JANUARY」等のstatic finalなフィールドが用意されているためこれらの使用を勧める。
Calendarクラスの日時は「年、月、日、時、分、秒、ミリ秒」と7つの整数値によって表現されている。そして、これらは相関関係を持つ。「秒」が59の場合に1を加えれば、0になると同時に「分」に1が加わる。また、日時の比較を行う場合、この7つすべての比較を行わなければならない。
こういった「日時の処理」は非常にバグを生みやすいため、add()メソッドやbefore()メソッド、after()メソッドの使用を強く勧める。
add()メソッドは「年、月、日、時、分、秒、ミリ秒」のいずれかを任意の量だけ増減できる。繰り上がり及び繰り下がりを計算してくれるため大変便利である。
before()メソッドおよびafter()メソッドは、他の「Calendarクラスのインスタンス」との比較を行う。「A.before( B )」は「A < B」、「A.after( B )」は「A > B」という比較を行う。
また大小の比較を行う場合にはcompareTo()メソッドを使用する。こちらは「compareTo」の項目を参照。
内部的には「1970/01/01 00:00:00.000」つまり「エポック」からのミリ秒という形式で日時を格納している。詳しくは「エポック」の項目を参照。
エポックからのミリ秒はgetTimeInMillis()メソッドで取得できる。
出力にはSimpleDateFormatクラスが向いているのでこのクラスを使用した方がよいだろう。
詳しくは「SimpleDateFormat」の項目を参照。
同じく日時を格納するクラスとしてDateクラスが存在するが、Dateクラスは現在「推奨されていない」ため、Calendarクラスを使用する方がよい。
Dateクラスとの相互変換の方法は「Date」の項目を参照。
ちなみに「Calender」ではなく「Calendar」なので注意。
日時を格納するためのクラス。日時を格納し、基本的な処理がひととおり行えるメソッドを持つ。
コンストラクタはprotectedのため直接呼び出すことはできない。getInstance()メソッドがstaticメソッドとして用意されており、このメソッドを呼ぶことでCalendarクラスのインスタンスを作成できる。また、このインスタンスには現在日時が格納されている。
ただし、正確に言うと「Calendarクラスのインスタンス」ではなく「Calendarクラスのサブクラスのインスタンス」である。詳しくは「GregorianCalendar」の項目を参照。
特定日時のセットにはset()メソッドを使用する。あらかじめclear()メソッドを呼び出しておくとエポックつまり「1970/01/01 00:00:00.000」にリセットしてくれるため、その後に希望の日時をセットするといいだろう。
年、月、日等を個別に取得する場合にはget()メソッドを使用する。
いずれも、項目を指定する場合には「Calendar.YEAR」等のstatic finalなフィールドを用いる。
また、月は-1された値となることに注意。これはプログラミングにおける慣習のようなもので、1月が0、12月が11となる。月を指定する際は、「Calendar.JANUARY」等のstatic finalなフィールドが用意されているためこれらの使用を勧める。
Calendarクラスの日時は「年、月、日、時、分、秒、ミリ秒」と7つの整数値によって表現されている。そして、これらは相関関係を持つ。「秒」が59の場合に1を加えれば、0になると同時に「分」に1が加わる。また、日時の比較を行う場合、この7つすべての比較を行わなければならない。
こういった「日時の処理」は非常にバグを生みやすいため、add()メソッドやbefore()メソッド、after()メソッドの使用を強く勧める。
add()メソッドは「年、月、日、時、分、秒、ミリ秒」のいずれかを任意の量だけ増減できる。繰り上がり及び繰り下がりを計算してくれるため大変便利である。
before()メソッドおよびafter()メソッドは、他の「Calendarクラスのインスタンス」との比較を行う。「A.before( B )」は「A < B」、「A.after( B )」は「A > B」という比較を行う。
また大小の比較を行う場合にはcompareTo()メソッドを使用する。こちらは「compareTo」の項目を参照。
内部的には「1970/01/01 00:00:00.000」つまり「エポック」からのミリ秒という形式で日時を格納している。詳しくは「エポック」の項目を参照。
エポックからのミリ秒はgetTimeInMillis()メソッドで取得できる。
出力にはSimpleDateFormatクラスが向いているのでこのクラスを使用した方がよいだろう。
詳しくは「SimpleDateFormat」の項目を参照。
同じく日時を格納するクラスとしてDateクラスが存在するが、Dateクラスは現在「推奨されていない」ため、Calendarクラスを使用する方がよい。
Dateクラスとの相互変換の方法は「Date」の項目を参照。
ちなみに「Calender」ではなく「Calendar」なので注意。
// Sample.java
import java.util.Date;
import java.util.Calendar;
import java.text.SimpleDateFormat;
public class Sample
{
public static void main( String[] args )
{
// 出力フォーマット。
// 「年/月/日 時:分:秒.ミリ秒」と出力します。
String format = "yyyy/MM/dd HH:mm:ss.SSS";
// 現在日時を格納したCalendarクラスのインスタンスを取得します。
Calendar now = Calendar.getInstance();
// Dateクラスへの変換はgetTime() メソッドを使用します。
Date output = now.getTime();
// 出力します。
System.out.println( new SimpleDateFormat( format ).format( output ) );
// 2010/03/04 16:33:26.421
// ……当然、実行時の日時によって出力結果は変わります。
// 任意の日時を指定する場合、あらかじめclear()メソッドで
// リセットしておくといいでしょう。
Calendar oneZero = Calendar.getInstance();
oneZero.clear();
System.out.println( new SimpleDateFormat( format ).format( oneZero.getTime() ) );
// 1970/01/01 00:00:00.000
// 年月日のセットはset()メソッドで行います。
// 2001年1月1日 0時0分0秒にセットします。
oneZero.set( 2001, 0, 1, 0, 0, 0 );
System.out.println( new SimpleDateFormat( format ).format( oneZero.getTime() ) );
// 2001/01/01 00:00:00.000
// 月に0を渡していることに注意してください。
// 月は0から始まります。1月が0、12月が11です。
// わかりやすくするために、専用のフィールドを使った方が
// いいでしょう。以下がその例です。
oneZero.set( 2001, Calendar.JANUARY, 1, 0, 0, 0 );
System.out.println( new SimpleDateFormat( format ).format( oneZero.getTime() ) );
// 2001/01/01 00:00:00.000
// get()メソッドを使用すれば任意の項目を取得できます。
// 「年」だけ取得します。
int year = oneZero.get( Calendar.YEAR );
System.out.println( year );
// 2001
// 日時をずらす場合にはadd()メソッドを使用します。
// 秒を1減らします。
oneZero.add( Calendar.SECOND, -1 );
System.out.println( new SimpleDateFormat( format ).format( oneZero.getTime() ) );
// 2000/12/31 23:59:59.000
// 「繰り上がり/繰り下がり」をちゃんと計算してくれます。
// 日時の増減は必ずこのメソッドを使用するようにして
// ください。けして各項目を直接計算しないようにしましょう。
// 日付の比較はbefore()メソッド/after()メソッドを使用します。
System.out.println( oneZero.before( now ) );
// true
System.out.println( oneZero.after( now ) );
// false
// A.before( B )はA < B、A.after( B )はA > Bという比較に
// なります。
// また、compareTo()メソッドを使えば大小を比較できます。
System.out.println( oneZero.compareTo( now ) );
// -1
// A.compareTo( B )と考えた場合、compareTo()メソッドの
// 結果は、ミリ秒数に変換後にA - Bした結果が返される、
// と考えると分かりやすいでしょう。
// Calendarクラスは、内部的には「エポックからのミリ秒」で
// 日時を格納しています。これはgetTimeInMillis()メソッド
// で取得できます。
long l = now.getTimeInMillis();
System.out.println( l );
// 1267688006421
}
}
import java.util.Date;
import java.util.Calendar;
import java.text.SimpleDateFormat;
public class Sample
{
public static void main( String[] args )
{
// 出力フォーマット。
// 「年/月/日 時:分:秒.ミリ秒」と出力します。
String format = "yyyy/MM/dd HH:mm:ss.SSS";
// 現在日時を格納したCalendarクラスのインスタンスを取得します。
Calendar now = Calendar.getInstance();
// Dateクラスへの変換はgetTime() メソッドを使用します。
Date output = now.getTime();
// 出力します。
System.out.println( new SimpleDateFormat( format ).format( output ) );
// 2010/03/04 16:33:26.421
// ……当然、実行時の日時によって出力結果は変わります。
// 任意の日時を指定する場合、あらかじめclear()メソッドで
// リセットしておくといいでしょう。
Calendar oneZero = Calendar.getInstance();
oneZero.clear();
System.out.println( new SimpleDateFormat( format ).format( oneZero.getTime() ) );
// 1970/01/01 00:00:00.000
// 年月日のセットはset()メソッドで行います。
// 2001年1月1日 0時0分0秒にセットします。
oneZero.set( 2001, 0, 1, 0, 0, 0 );
System.out.println( new SimpleDateFormat( format ).format( oneZero.getTime() ) );
// 2001/01/01 00:00:00.000
// 月に0を渡していることに注意してください。
// 月は0から始まります。1月が0、12月が11です。
// わかりやすくするために、専用のフィールドを使った方が
// いいでしょう。以下がその例です。
oneZero.set( 2001, Calendar.JANUARY, 1, 0, 0, 0 );
System.out.println( new SimpleDateFormat( format ).format( oneZero.getTime() ) );
// 2001/01/01 00:00:00.000
// get()メソッドを使用すれば任意の項目を取得できます。
// 「年」だけ取得します。
int year = oneZero.get( Calendar.YEAR );
System.out.println( year );
// 2001
// 日時をずらす場合にはadd()メソッドを使用します。
// 秒を1減らします。
oneZero.add( Calendar.SECOND, -1 );
System.out.println( new SimpleDateFormat( format ).format( oneZero.getTime() ) );
// 2000/12/31 23:59:59.000
// 「繰り上がり/繰り下がり」をちゃんと計算してくれます。
// 日時の増減は必ずこのメソッドを使用するようにして
// ください。けして各項目を直接計算しないようにしましょう。
// 日付の比較はbefore()メソッド/after()メソッドを使用します。
System.out.println( oneZero.before( now ) );
// true
System.out.println( oneZero.after( now ) );
// false
// A.before( B )はA < B、A.after( B )はA > Bという比較に
// なります。
// また、compareTo()メソッドを使えば大小を比較できます。
System.out.println( oneZero.compareTo( now ) );
// -1
// A.compareTo( B )と考えた場合、compareTo()メソッドの
// 結果は、ミリ秒数に変換後にA - Bした結果が返される、
// と考えると分かりやすいでしょう。
// Calendarクラスは、内部的には「エポックからのミリ秒」で
// 日時を格納しています。これはgetTimeInMillis()メソッド
// で取得できます。
long l = now.getTimeInMillis();
System.out.println( l );
// 1267688006421
}
}
// Sample.java import java.util.Date; import java.util.Calendar; import java.text.SimpleDateFormat; public class Sample { public static void main( String[] args ) { // 出力フォーマット。 // 「年/月/日 時:分:秒.ミリ秒」と出力します。 String format = "yyyy/MM/dd HH:mm:ss.SSS"; // 現在日時を格納したCalendarクラスのインスタンスを取得します。 Calendar now = Calendar.getInstance(); // Dateクラスへの変換はgetTime() メソッドを使用します。 Date output = now.getTime(); // 出力します。 System.out.println( new SimpleDateFormat( format ).format( output ) ); // 2010/03/04 16:33:26.421 // ……当然、実行時の日時によって出力結果は変わります。 // 任意の日時を指定する場合、あらかじめclear()メソッドで // リセットしておくといいでしょう。 Calendar oneZero = Calendar.getInstance(); oneZero.clear(); System.out.println( new SimpleDateFormat( format ).format( oneZero.getTime() ) ); // 1970/01/01 00:00:00.000 // 年月日のセットはset()メソッドで行います。 // 2001年1月1日 0時0分0秒にセットします。 oneZero.set( 2001, 0, 1, 0, 0, 0 ); System.out.println( new SimpleDateFormat( format ).format( oneZero.getTime() ) ); // 2001/01/01 00:00:00.000 // 月に0を渡していることに注意してください。 // 月は0から始まります。1月が0、12月が11です。 // わかりやすくするために、専用のフィールドを使った方が // いいでしょう。以下がその例です。 oneZero.set( 2001, Calendar.JANUARY, 1, 0, 0, 0 ); System.out.println( new SimpleDateFormat( format ).format( oneZero.getTime() ) ); // 2001/01/01 00:00:00.000 // get()メソッドを使用すれば任意の項目を取得できます。 // 「年」だけ取得します。 int year = oneZero.get( Calendar.YEAR ); System.out.println( year ); // 2001 // 日時をずらす場合にはadd()メソッドを使用します。 // 秒を1減らします。 oneZero.add( Calendar.SECOND, -1 ); System.out.println( new SimpleDateFormat( format ).format( oneZero.getTime() ) ); // 2000/12/31 23:59:59.000 // 「繰り上がり/繰り下がり」をちゃんと計算してくれます。 // 日時の増減は必ずこのメソッドを使用するようにして // ください。けして各項目を直接計算しないようにしましょう。 // 日付の比較はbefore()メソッド/after()メソッドを使用します。 System.out.println( oneZero.before( now ) ); // true System.out.println( oneZero.after( now ) ); // false // A.before( B )はA < B、A.after( B )はA > Bという比較に // なります。 // また、compareTo()メソッドを使えば大小を比較できます。 System.out.println( oneZero.compareTo( now ) ); // -1 // A.compareTo( B )と考えた場合、compareTo()メソッドの // 結果は、ミリ秒数に変換後にA - Bした結果が返される、 // と考えると分かりやすいでしょう。 // Calendarクラスは、内部的には「エポックからのミリ秒」で // 日時を格納しています。これはgetTimeInMillis()メソッド // で取得できます。 long l = now.getTimeInMillis(); System.out.println( l ); // 1267688006421 } }