[???] /
[Java FAQ] / [S100]
S100: Date / Calendar
[Q1]
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]
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]
日付の妥当性をチェックしたいのですが、どうすればよいですか?
存在しない日付を入れた時にエラーを出すとかしたいです。
[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]
ある日付の曜日を知りたいのですが、どうすればよいですか?
[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]
月の末日を知りたいのですが、どうすればよいですか?
[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]
日付をきまった形式で出力したいのですが、良い方法はありますか?
[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]
WindowsNTのJavaが16時間ずれた値を返すのですが?
[A7]
バグです。おそらくWindowsNT4.0が正しいLocaleを返さないことが原因です。
環境変数TZを、
TZ=JST-9
ように設定して、タイムゾーンを明示的に指定するか
最新のService Packをインストールしてください。
contributor: Hideyuki Kagami
コメントの送り先 Java FAQ BBS