[???] / [Java FAQ] / [S100]
S100: Date / Calendar

[Q1]
Back
DateやCalendarの月の値が1月ずれてしまっているようです。なぜでしょうか? [A1] Date#getMonth()やCalendar#get(MONTH)で返ってくる数を そのまま使用していませんか? DateやCalendarは、月を0から始まる数で表します。 したがって1月は"0"、2月は"1"、12月は"11"、となります。 Date#setMonth()やCalendar#set(MONTH)で設定する数も同様の注意が必要です。 月が0で始まることに対して日本人は違和感を感じますが、 英語圏では、月をJanuary,February,...など「名前」で表現するため、 月の始まりを0にするか1にするかは、日本ほど大きなこだわりは無いようです。 C言語の日付を示す構造体 struct tm では、月を0から始まる数字としていますが、 これは、月名の文字列を配列にした場合、配列の添え字にそのまま使用できる という理由によるものです。 Javaでもそのような考え方を踏襲したものと思われます。
[Q2]
Back
Dateクラスに2000年1月1日を入れようとして、new Date(2000,0,1)と書くと エラーが出ます。なぜですか? [A2] Dateクラスの「年」を入力するフィールドは、1900年からの数え年を指定する ようになっています。 2000年1月1日を入れたい場合は、以下のように指定します。 Date date = new Date(100,0,1); なお、JDK 1.1 以降では、Dateクラスによる日付の操作は推奨されていません。 代わりにCalendarクラスを使用しましょう。
[Q3]
Back
日付の妥当性をチェックしたいのですが、どうすればよいですか? 存在しない日付を入れた時にエラーを出すとかしたいです。 [A3] Calendar#setLenient()を使用しましょう。 存在しない日付をCalendarに設定した場合、setLenient()の引数にfalseを 指定すれば、Calendar#getTime()などのメソッドを呼び出したときに、 IllegalArgumentExceptionがthrowされます。 (例) Calendar cal = Calendar.getInstance(); cal.setLenient( false ); // 厳密なチェックを行う cal.set(2000, 0, 100); // 2000年1月100日を指定 try { Date date = cal.getTime(); } catch (IllegalArgumentException e) { System.out.println("Error: 指定の年月日は存在しません"); }
[Q4]
Back
ある日付の曜日を知りたいのですが、どうすればよいですか? [A4] "月","火",...の文字を得たい場合は、java.text.SimpleDateFormatを 使用するとよいでしょう。 (例) Date currentTime = calendar.getTime(); SimpleDateFormat formatter = new SimpleDateFormat ("EEE",Locale.JAPANESE); String dateString = formatter.format(currentTime); また、「今日が日曜だったらこうしたい」などという処理をしたい場合は、 DAY_OF_WEEKフィールドを使用します。 (例) Calendar calendar; ... if (calendar.get(DAY_OF_WEEK) == Calendar.SUNDAY) { // 日曜日だったら // calendarが日曜日の場合の処理 ... }
[Q5]
Back
月の末日を知りたいのですが、どうすればよいですか? [A5] JDK 1.2 以降であれば、 Calendar#getActualMaximum()を使用しましょう。 (例) 今月の末日を取得 (JDK 1.2 以降) Calendar calendar = Calendar.getInstance(); int last = calendar.getActualMaximum(Calendar.DATE); // 変数"last"に末日が格納される JDK 1.1 にはCalendarクラスにgetActualMaximum()メソッドが用意されていません。 代わりに、以下のような手順で末日を取得できます。 1. Calendarに対して、調べたい月の「翌月の0日」を指定する。 2. DATEフィールドの値を取得する。 (例) 今月の末日を取得 (JDK 1.1) Calendar calendar = Calendar.getInstance(); calendar.add(Calendar.MONTH, 1); // 翌月を指定 calendar.set(Calendar.DATE, 0); // 0日を指定 int last = calendar.get(Calendar.DATE); // 変数"last"に末日が格納される
[Q6]
Back
日付をきまった形式で出力したいのですが、良い方法はありますか? [A6] java.text.SimpleDateFormatを使うと簡単にできます。 (例) 現在の日付を、"曜日, 日月年 時:分:秒 タイムゾーン" の形式で表示 SimpleDateFormat dateformatter = new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss zzz"); String dateString = dateformatter.format(new Date()); System.out.println(dateString);
[Q7]
Back
WindowsNTのJavaが16時間ずれた値を返すのですが? [A7] バグです。おそらくWindowsNT4.0が正しいLocaleを返さないことが原因です。 環境変数TZを、 TZ=JST-9 ように設定して、タイムゾーンを明示的に指定するか 最新のService Packをインストールしてください。

Back
contributor: Hideyuki Kagami
コメントの送り先 Java FAQ BBS