• ベストアンサー

Calendarクラスについて

java勉強中の初心者です。 現在、カレンダークラスの勉強をしています。 いろいろ試しているのですが、お聞きしたいこと があります。 末日を取得するgetActualMaximumメソッドですが Calendar cl = Calendar.getInstance(); int lastDay = cl.getActualMaximum(Calendar.DATE); でその月の末日を取得できることがわかりましたが 応用で、1年間の(1月~12月)すべてを取得するときに -------------------------------------------------- Calendar cl = Calendar.getInstance(); for(int n = 1; n<=12; n++){ cl.set(2005,12+n,1); cl.add(Calendar.DAY_OF_MONTH,1); cl.set(cl.get(Calendar.YEAR),cl.get(Calendar.MONTH),cl.getActualMaximum(Calendar.DATE)); System.out.println(cl.get(Calendar.YEAR) +"年"+ cl.get(Calendar.MONTH ) + "月"+ cl.getActualMaximum(Calendar.DATE) +"日"); } } } ------------------------------------------------- 月は「0」から始まるということは理解できたのですが これだと実行結果が 2006年1月28日 2006年2月31日 2006年3月30日 2006年4月31日 2006年5月30日 2006年6月31日 2006年7月31日 2006年8月30日 2006年9月31日 2006年10月30日 2006年11月31日 2007年0月31日 ---------------------------------------------- となってしまうのですが、一番初めが2月の 末日を取得してしまっているのはわかっているのですが どこを直せばよいのかわかりません。 ご教授お願いできますか? よろしくお願いいたします。

  • Java
  • 回答数3
  • ありがとう数1

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

  • ベストアンサー
  • alphion
  • ベストアンサー率19% (27/136)
回答No.1

>月は「0」から始まるということは理解できたのですが ということは、セットするときも0から、 >for(int n = 1; n<=12; n++) for(int n = 0; n<12; n++)

camp-fanks
質問者

補足

ご回答ありがとうございます。 n=0にして実行すると 2006年0月31日    ・    ・ 2006年11月31日 どの段階で月に「1」を足すのか・・ cl.setとSystem,outの段階で「1」を 足すととんでもない実行結果が・・・ ここがわかりません。 よろしくお願いします。

その他の回答 (2)

  • tom11
  • ベストアンサー率53% (134/251)
回答No.3

こんにちは、 1月は、あくまでも0として、 出力形式で、調整をすると、良いかと思います。 サンプルリストです。 Calendar ca = Calendar.getInstance(); for(int i=0;i<12;++i){ ca.set(Calendar.MONTH,i); ca.set(Calendar.DATE,1); ca.set(Calendar.DATE,ca.getActualMaximum(Calendar.DATE)); System.out.printf("%1$ty/%1$tm/%1$td \n",ca); } 出力結果は 以下のようになりました。 06/01/31 06/02/28 06/03/31 06/04/30 06/05/31 06/06/30 06/07/31 06/08/31 06/09/30 06/10/31 06/11/30 06/12/31

回答No.2

No.1さんが書いていることだけでは足りなくて、 cl.get(Calendar.MONTH )の値は 1月→0 2月→1 ・・ 12月→11 と格納されるので出力するときに System.out.println(cl.get(Calendar.YEAR) +"年"+ (cl.get(Calendar.MONTH )+1) + "月"+ cl.getActualMaximum(Calendar.DATE) +"日"); とする必要があります。つまり、人間が通常使う数字で月を表示するためには1足さなければいけません。

camp-fanks
質問者

お礼

ありがとうございます。 「1」を足す箇所が間違えておりました。

関連するQ&A

  • java Calendarクラス

    javaで月、日を入力してカレンダーを作成したのですが 年と月のsetでmonth-1はマジックナンバーなので直したいのですが どなたかわかる方教えてください。 package sample; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.*; public class Test { private final static int firstday = 1; public static void main(String[] args) { //カレンダーのインスタンスを取得します Calendar cal = Calendar.getInstance(); //文字入力 BufferedReader input = new BufferedReader(new InputStreamReader(System.in)); //年を取得 int year =0; //月を取得 int month =0; //最後の日付 int lastDay =0; //月初めの曜日を取得 int week =0; //年妥当性チェック boolean CheckYear = true; //月妥当性チェック boolean CheckMonth = true; try { //年妥当性チェック while(CheckYear){ System.out.println("年を入力してください"); //年を入力します year = Integer.parseInt(input.readLine()); //年が4桁の場合 if(String.valueOf(year).length()==4){ CheckYear = false; }else{ System.out.println("年は4桁で入力してください"); } } //月妥当性チェック while(CheckMonth){ System.out.println("月を入力してください"); //月を入力します month = Integer.parseInt(input.readLine()); //月が1~12の場合 if(month>=1&&month<=12){ CheckMonth = false; }else{ System.out.println("月1~12を入力してください"); } } }catch(IOException e){ System.out.println("数字以外は入力しないでください"); System.out.println("処理を中断します"); return; }catch (Exception a) { System.out.println("数字以外は入力しないでください"); System.out.println("処理を中断します"); return; } //年、月をセットします cal.set(year,month-1,cal.getActualMinimum(Calendar.DATE)); //月初めの曜日を取得 week = cal.get(Calendar.DAY_OF_WEEK); //年月を出力する System.out.println(String.valueOf(year)+"年"+String.valueOf(month)+"月"); //曜日を出力する System.out.println("日 月  火  水  木  金  土"); //最後の日付を取得する lastDay = cal.getActualMaximum(Calendar.DAY_OF_MONTH); /* * 最後の日付を取得する */ if(month==1||month==3||month==7||month==8||month==10||month==12) { lastDay = cal.getActualMaximum(Calendar.DAY_OF_MONTH); }else if(month==4||month==6||month==9||month==11){ lastDay = cal.getActualMaximum(Calendar.DAY_OF_MONTH); }else if(year%4==0&&month==2){ lastDay = cal.getActualMaximum(Calendar.DAY_OF_MONTH); }else if(year%4!=0&&month==2){ lastDay = cal.getActualMaximum(Calendar.DAY_OF_MONTH); } /* * カレンダーを出力する */ //最後の日付まで繰り返す // 最後の日付まで繰り返す for (int i = 1; i <= lastDay; i++) { // 1日とそれ以外で分岐する if (i == 1) { // 1日の曜日位置まで移動する for (int j = 1; j < cal.get(Calendar.DAY_OF_WEEK); j++) { System.out.print(" "); } } else { // 日付を増やす cal.add(Calendar.DAY_OF_MONTH, firstday); } // 1~9と10~で表示を変える if (i < 10) { System.out.print(" " + i); } else { System.out.print(" " + i); } // 土曜日になったら改行する if (cal.get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY) { System.out.println(""); } } } }

  • 入力された年月からその月の末日を取得する

    import java.util.*; class Sample { public static void main(String[] args) { System.out.println(args[0]); Calendar cal = Calendar.getInstance(); cal.set(2000,1,1); int y = cal.get(Calendar.YEAR); int m = cal.get(Calendar.MONTH) + 1; int last = cal.getActualMaximum(Calendar.DATE); System.out.print(y + "年" + m + "月の末日は "); System.out.println(last + "日です"); } } で、2000年2月の末日を取得することが出来るのはわかったのですが プログラム上で年月の入力を促してその月の末日を取得するにはどうすればいいのでしょうか? (プログラム実行例) C:\JAVA\SAMPLE>java Sample 2009 2 2009年2月の末日は 28です ↑のようにプログラム上で年 月を入力して実行し、末日を取得したいのですが・・・ 多分この場合、入力数値などに対する例外処理や閏年の処理などもやらないとダメだと思いますがよくわかりません

    • ベストアンサー
    • Java
  • 配列を使ってカレンダーを表示したい。

    配列を使った場合のカレンダー表示方法で質問します。 現在、 Calendarクラスを使い、配列に日を入れていくようにしているのですが Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5 at CalendarSample.main(CalendarSample.java:33) のようなエラーが生じます。 以下のような手順でで考えることは可能なのでしょうか? よろしくお願いします。 Calendar cal = Calendar.getInstance(); //最終日 int max = cal.getActualMaximum(Calendar.DAY_OF_MONTH); //月の週の合計数 int week = cal.get(Calendar.WEEK_OF_MONTH); //日を格納する配列 int[][] date = new int[week][7]; int n = 0; for(int d=1;d<=max;d++){ //年月日の設定 cal.set(2011,6,d); int youbi = cal.get(Calendar.DAY_OF_WEEK); date[n][youbi] =d; //日が、土曜になったら、配列の列を変える if(cal.get(Calendar.DAY_OF_WEEK)==6){ n+=1; } }

  • Calendarクラスの日付更新について

    ある日付を追加した時,うまく正式な日付になりません。 (1) 2002年9月30日にセットする (2) 1日追加する --→この時点で2002年9月31日になっている。 (3) 10月1日に正式な日付に直す という流れなのですが・・・ ソースは以下のとおりです。 public static void main(String[] args) {        Calendar cal = new GregorianCalendar();     /*(1)*/     cal.set(2002,9,30);    /*(2)*/     cal.add(Calendar.DATE,1); /*(3)*/ cal.set(cal.get(Calendar.YEAR),cal.get(Calendar.MONTH),cal.get(Calendar.DATE) ); System.out.println(cal.get(Calendar.YEAR) "年"+ cal.getCalendar.MONTH) +"月"+ cal.get(Calendar.DATE) +"日"); } と、表示させると2002年10月1日になっておらず2002年9月31日になったままです。 これはどこに原因があるのでしょうか?ご指導お願いします。

    • ベストアンサー
    • Java
  • Calendarクラスでエラーがでる

    こんにちは。 以下の単純なコードでエラーが出ます。 import java.util.Calendar; public class CalTest { public static void main(String args[]) { Calendar cal = cal.getInstance(); int year = 2002, month = 9, day = 19; cal.set(year,month,day); } } エラーは CalTest.java:6: 変数 cal は初期化されていない可能性があります。 Calendar cal = cal.getInstance(); です。使っているのはj2sdk1.4.0_01ですが、方法が変わったんでしょうか? 誰か分かる人がいたら教えてください。よろしくお願いします。

    • ベストアンサー
    • Java
  • カレンダークラス

    入力値の日付から1年後の日付をもとめたいのですが、よく分かりません。 入力値は XXXX年 XX月 XX日 のような感じです。 Calendar cal1 = Calendar.getInstance(); cal1.set(int,int,int);で上記で入力された値をint型にして設定し、 その後に、cal1.add(Calender.YEAR,1); としています。 なのですが、なぜだか1ヶ月進んだ値が返却されます、、 2009/01/01なら2010/02/01が返却される。 また現在日付を取得して表示しても1ヶ月進んで表示されるのですが、、 どなたか詳しい方教えて下さい。宜しくお願いします。

    • ベストアンサー
    • CGI
  • Calendarクラスのフィールドは、クラス変数?インスタンス変数?どちらですか?

    宜しくお願いします。 Calendarクラスのフィールドの、Calendar.YEARなどは、 Calendarというクラス名で修飾されているので「クラス変数」ですよね。 クラス変数なので、全てのインスタンスで共有されているはずです。 なので、あるインスタンスから、Calendar.YEARに変更を加えると、全てのインスタンスに 変更が適用されると思うのですが、そうなりません。何故でしょうか。 例えば以下のようなコードを書いた場合、このように出力されます。 2008年10月6日 2009年10月6日 2008年10月6日 YEARはクラス変数なので、3つ目の出力も2009年になると思ったのですが、YEARは 各インスタンスで所有されているようです。 (上手くインデントできないようでして、読みにくいコードで失礼します) import java.util.*; public class DateTest { public static void main(String[]args){ Calendar cal = Calendar.getInstance(); showDate(cal); Calendar cal2 = Calendar.getInstance(); cal2.add(Calendar.YEAR, 1);//ここでCalendarのクラス変数を変更している showDate(cal2);//変更が適用されている showDate(cal);//変更が適用されていない?なぜ? }  //Calendarインスタンスの年・月・日を出力する public static void showDate(Calendar cal){ System.out.println(cal.get(Calendar.YEAR)+"年"              +(cal.get(Calendar.MONTH)+1)+"月" +cal.get(Calendar.DATE)+"日"); } } プログラムは嘘をつかないので、自分の理解が誤っていると思います。 どなたか解決する知識をお持ちの方、どうぞご教示ください。 (初心者ですので、できれば、ほどほどのレベルの説明でお願いします。) 宜しくお願いします。

  • java Calendar作成

    javaでのカレンダー作成についての質問です。 表示イメージ(_はすべて半角スペースの意です) year年month月(今回は2016年04月) _日_月_火_水_木_金_土 _______________1__2_ _3__4__5__6__7__8__9_ 10_11_12_13_14_15_16_ 17_18_19_20_21_22_23_ 24_25_26_27_28_29_30_ public class CalShow { public static void main(String[] args) { java.util.Calendar cal = java.util.Calendar.getInstance(); int year = Integer.parseInt(args[0].substring(0, 4)); int month = Integer.parseInt(args[0].substring(4)); cal.set(java.util.Calendar.YEAR, year); cal.set(java.util.Calendar.MONTH, month - 1); cal.set(java.util.Calendar.DAY_OF_MONTH, 1); //日曜日=1で土曜日=7まで int week = cal.get(java.util.Calendar.DAY_OF_WEEK); //月末日 int lastDay = cal.getActualMaximum(java.util.Calendar.DAY_OF_MONTH); System.out.println( year + "年" + month + "月"); System.out.println("_日_月_火_水_木_金_土"); //日付のない日数分回す for (int i = 1; i < week ; i ++) { System.out.print("___(半角3マス)"); } String empty; //1日から月末日まで、カレンダーを表示する for (int day = 1 ; day <= lastDay ; day ++) { empty = ""; if (day < 10) { empty = "_"; } System.out.print( empty + day + "_"); ●if ( == java.util.Calendar.SATURDAY) { System.out.println(""); } } } } ●部分で土曜日なら改行、としたいのですが、 上でint weekで土曜日=7と判明しているため、 if ( week == java.util.Calendar.SATURDAY) { とか if ( day % 7 == java.util.Calendar.SATURDAY) { など色々考え付くものを書き込んでいるのですが全く上手く動作しません。 どうしたらよいのかご教授お願いいたします・・・;;

    • ベストアンサー
    • Java
  • java コマンドライン引数を利用したカレンダー

    args[0]に例えば200805と入れたら2008年5月のカレンダーが表示される、そんなプログラムを書きたいと思っています。 理想は↓の形です。(_は空欄の意です;) 2008年5月 日 月 火 水 木 金 土 ___________1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 importは使わないよう指示が出ていますので、フルネームでカレンダークラスを記載しています。 public class CalShow { public static void main(String[] args) { // TODO 自動生成されたメソッド・スタブ java.util.Calendar cal = java.util.Calendar.getInstance(); //コマンドライン引数の前4桁をyear、 int year = Integer.parseInt(args[0].substring(0, 4)); //後ろ2桁をmonthとしてそれぞれintで定義 int month = Integer.parseInt(args[0].substring(4)); System.out.println( year + "年" + month + "月"); System.out.println(" 日 月 火 水 木 金 土"); cal.set(year, month - 1, 1); int startDay = cal.get(java.util.Calendar.DAY_OF_WEEK); cal.add(java.util.Calendar.MONTH, 1); cal.add(java.util.Calendar.DATE, -1); int lastDay = cal.get(java.util.Calendar.DATE);      /*なんとなくここまで書けたのですが、ここからどのように木曜日と1日を繋げていけばよいのか分からなくて困っています。 どういったメソッドを使えばいいのかなど、どなたか教えていただけませんでしょうか? よろしくお願いいたします。*/ } }

    • ベストアンサー
    • Java
  • Javascriptで日付毎のチェックボックスを判断する方法

    JAVAで予約できるカレンダーを作成するという課題が学校で出てしまい非常に困っています。 仕様: カレンダー関数により、年・月・日を取得しています。 Calendar cal = Calendar.getInstance(); cal.set(cal.get(Calendar.YEAR),cal.get(Calendar.MONTH),cal.get(Calendar.DATE)); int YEAR = cal.get(Calendar.YEAR); int MONTH = cal.get(Calendar.MONTH)+1; int DATE = cal.get(Calendar.DATE); 下記の機能を”Javascript”で実現したいのですが、力不足でどうすることもできません。 実装したい機能: 予約の日付はカレンダー上にある日付毎に設置されたチェックボックスで判断します。予約できる日付は、選択した日付から前後連続した日付けのみ選択可能で、他の日付をまたいで予約することはできないようにする、というものです。 例をあげてみます。 10月10日のチェックボックスを選択したとします。選択した時点で10月の9、10、11日のみチェックボックスにチェックが可能となり、その他はdisabledにします。 次に10月11日のチェックボックスを選択すると、選択した時点で10月の9、12日が選択できるようになります。予約は連続した日付のみ可能ですので、10、11日とその他はdisabledにしなくてはなりません。 どのようなアドバイスでもかまいません。 回答をお願いします。

専門家に質問してみよう