• ベストアンサー

java.util.Dateについて

まずは下記ソースを参照してください。 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 です。

質問者が選んだベストアンサー

  • ベストアンサー
  • yutopapa
  • ベストアンサー率47% (139/295)
回答No.2

これよく間違えやすいんですよね。 GregorianCalendarクラスの月は0~11なのです。 ですので、5月は4となります。 GregorianCalendar cal = new GregorianCalendar(2004, 5-1, 31); というコードに直せば問題なくなると思います。

susumufire
質問者

お礼

早速のご回答ありがとうございました。 「Calendar」クラスということで、 1月~12月だと思ってしまいました。 これでは、確かに間違えやすいですね。 質問1が理解できれば同時に質問2も分かったんですね。 ありがとうございました。

その他の回答 (3)

  • moccos
  • ベストアンサー率43% (61/140)
回答No.4

■当方も初心者なので勉強させてもらいました。(蛇足ながら・・・) 配列の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

susumufire
質問者

お礼

ご回答ありがとうございました。 C言語でも同じだったんですね。 知りませんでした。 今後C言語を勉強する際、意識してみます。 ありがとうございました。

回答No.3

まずは、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の場合)

susumufire
質問者

お礼

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

  • t-satoh
  • ベストアンサー率35% (211/591)
回答No.1

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

susumufire
質問者

お礼

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

関連するQ&A