プロが教えるわが家の防犯対策術!

まずは下記ソースを参照してください。

import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Calendar;

public class Test{
    public static void main( String args[] ){
        GregorianCalendar cal = new GregorianCalendar(2004, 5, 31);
        System.out.println("年:" + cal.get(Calendar.YEAR));
        System.out.println("月:" + cal.get(Calendar.MONTH));
        System.out.println("日:" + cal.get(Calendar.DAY_OF_MONTH));
        System.out.println(); // ただの改行
        System.out.println("比較:" + new Date().compareTo(cal.getTime()));
    }
}

上記ソースについて質問です。
1.「年」「月」「日」を表示しておりますが、本来ならば
「年:2004」
「月:5」
「日:31」
と表示されると思っておりましたが実際は、
「年:2004」
「月:6」
「日:1」
と表示されてしまいます。
なぜでしょうか?

2.12行目にてjava.util.DateクラスのcompareToメソッドを用いて、
現在日付(2004/5/28)と7行目で指定している日付の比較をしていますが、
7行目で設定している日付を現在日付よりも前後に設定して実行させても、
「-1」しか返りません。
なぜでしょうか?

環境は、
J2SDK:1.4.2
OS:Windows XP Pro
です。

A 回答 (4件)

これよく間違えやすいんですよね。



GregorianCalendarクラスの月は0~11なのです。
ですので、5月は4となります。

GregorianCalendar cal = new GregorianCalendar(2004, 5-1, 31);

というコードに直せば問題なくなると思います。
    • good
    • 0
この回答へのお礼

早速のご回答ありがとうございました。
「Calendar」クラスということで、
1月~12月だと思ってしまいました。
これでは、確かに間違えやすいですね。

質問1が理解できれば同時に質問2も分かったんですね。
ありがとうございました。

お礼日時:2004/05/31 09:03

■当方も初心者なので勉強させてもらいました。

(蛇足ながら・・・)
配列のindexと同じ考え方?のようで C でも同じだそうです。

○入力している部分では[1]引いて、出力している部分は[1]加えるから
 ややこしいですが表示してみるとわかり易い気がします。

GregorianCalendar cal = new GregorianCalendar(2004,(5-1),30);
System.out.println("年:" + cal.get(Calendar.YEAR));
System.out.println("月:" + (cal.get(Calendar.MONTH)+1));
System.out.println("日:" + cal.get(Calendar.DAY_OF_MONTH));
//実際に比較している部分を出力してみる
System.out.println( new Date());
System.out.println(cal.getTime());
System.out.println("比較:" + new Date().compareTo(cal.getTime()));

同じ日付を入力しても当然時間データが無いので[new Date()]の方が大きく
なる←えらそうに書きましたが当方も出力されて気づきましたm(_~_)m
    • good
    • 0
この回答へのお礼

ご回答ありがとうございました。
C言語でも同じだったんですね。
知りませんでした。

今後C言語を勉強する際、意識してみます。
ありがとうございました。

お礼日時:2004/05/31 09:05

まずは、1の回答から


2004年5月31日にセットする場合は、以下のように指定します。
GregorianCalendar cal = new GregorianCalendar(2004,4,31);
なぜなら、Calendar.MONTHの範囲が0から11までだからです。
また、月を取得して現在時間を表示する場合は、
(cal.get(Calendar.MONTH) + 1)のように指定します。
こちらも同様の理由です。

2,について
a,System.out.println("比較:" + new Date().compareTo(cal.getTime()));
→-1
b,System.out.println("比較:" + cal.getTime().compareTo(new Date()));
→1
なぜー1が返るかというと、()内のDateオブジェクトのほうが大きいからです。(aの場合)
    • good
    • 0
この回答へのお礼

ご回答ありがとうございました。

0~11だとは気づきもしませんでした。
ありがとうございました。

お礼日時:2004/05/31 09:04

 月は1~12ではなく、0~11となります。

    • good
    • 0
この回答へのお礼

早速のご回答ありがとうございました。
色々と試してみましたところ、
ご回答の通りとなりました。
ありがとうございました。

お礼日時:2004/05/31 09:00

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!