- PR -

Calendarクラスについての質問です。

1
投稿者投稿内容
がんこチーム
会議室デビュー日: 2004/09/08
投稿数: 15
投稿日時: 2004-09-23 19:32
「今月の最大値」を求めるため、以下のようなソースを書き

Calendar calendar = Calendar.getInstance();

calendar.set(
Calendar.DAY_OF_MONTH,
calendar.getMaximum(Calendar.DAY_OF_MONTH));
calendar.set(
Calendar.HOUR_OF_DAY,
calendar.getMaximum(Calendar.HOUR_OF_DAY));
calendar.set(
Calendar.MINUTE,
calendar.getMaximum(Calendar.MINUTE));

System.out.println(calendar.get(Calendar.DAY_OF_MONTH));のようにして、このCalenarクラスの日付を求めたところ、 1  と結果が返ってきました。

ためしに、calendar.set(Calendar.MONTH, 9);として月を10月のに設定したところ、 31 と結果が返ってきました。

なぜ、9月は1と帰ってくるのかが分かりません。教えてください。
coasm
大ベテラン
会議室デビュー日: 2001/11/26
投稿数: 237
投稿日時: 2004-09-23 23:13
calendar.getMaximum(Calendar.DAY_OF_MONTH)は、常に31です。

calendar.set(Calendar.DAY_OF_MONTH,
calendar.getMaximum(Calendar.DAY_OF_MONTH))
すると、9月31日に設定しようとして、そんな日付は存在しないので10月1日に変換されます。
10月だったら、問題なく10月31日に設定されるわけです。

「今月の最後の日」を求めるなら、
calendar.set(Calendar.MONTH,1); // x月1日
calendar.roll(Calendar.MONTH,+1); // x+1月1日
calendar.roll(Calendar.DATE,-1); // x月最後の日
のようにすれば良いのでは?
(動作確認していません)


[ メッセージ編集済み 編集者: coasm 編集日時 2004-09-24 09:08 ]
a-san
ベテラン
会議室デビュー日: 2004/06/01
投稿数: 53
投稿日時: 2004-09-24 01:00
// 現在日時の生成
Calendar now = Calendar.getInstance();
SimpleDateFormat formatter = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss.S");
// 今月は何日まであるか?(例えば、2004年02月は29。2004年07月は31)
int days = now.getActualMaximum(Calendar.DAY_OF_MONTH);
System.out.println("今月は "+days+" 日あります");

// その月末は?
Calendar endOfTheMonth = new GregorianCalendar(now.get(Calendar.YEAR), now.get(Calendar.MONTH), days);
System.out.println("月末は "+formatter.format(endOfTheMonth.getTime()));

// 指定された年・月は何日まであるか?(mm=0..11とする)
Calendar aDay = new GregorianCalendar(2000, 2-1, 1); // 2月
int days2 = aDay.getActualMaximum(Calendar.DAY_OF_MONTH);
System.out.println("2000年2月は "+days2+" 日あります");
こちらにカレンダー関係をまとめてみました。
http://www.hcn.zaq.ne.jp/no-ji/javamemo/java_util_Calendar.html

[ メッセージ編集済み 編集者: a-san 編集日時 2004-09-24 01:15 ]
がんこチーム
会議室デビュー日: 2004/09/08
投稿数: 15
投稿日時: 2004-09-24 09:35
本当にありがとうございます。
getActualMaximumを使って解決することが出来ました。

calendar.set(
Calendar.DAY_OF_MONTH,
calendar.getActualMaximum(Calendar.DAY_OF_MONTH));

calendar.set(
Calendar.HOUR_OF_DAY,
calendar.getActualMaximum(Calendar.HOUR_OF_DAY));

calendar.set(
Calendar.MINUTE,
calendar.getActualMaximum(Calendar.MINUTE));
1

スキルアップ/キャリアアップ(JOB@IT)