質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

2回答

5874閲覧

Java:calendarクラスのsetの月ズレについて

yosikawa

総合スコア14

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2020/05/17 07:12

Java学習中の者です。

Javaのcalendarクラスを使用していた際に、原因の分からない点が
出てきたため質問をさせていただきます。

現在「年」と「月」を入力すると、入力値に応じて「年・月・日・曜日」を
出力するプログラムを作成しているのですが、
Calendarのsetメソッドを使用したところ、「月」にズレが発生してしまいました。

コード内のコメントに記載しておりますが、
monthList内の値に対してCalendarの月(MONTH)をセットしたところ、
月が1つズレてしまいました。
ググッてみたのですが、Calendarクラスのズレに関しては
「1月は0として扱う」という記述くらいしか見つからず、こちらで質問をさせていただきました。

どうか、ご助言をよろしくお願いいたします。

コードは以下の通りです。

Java

1 public static void main(String args[]) { 2 3 Calendar calendar = Calendar.getInstance(); 4 5 List<Integer> yearList = new ArrayList<Integer>(); 6 List<Integer> monthList = new ArrayList<Integer>(); 7 8 yearList.add(2020); 9 monthList.add(4); 10 monthList.add(5); 11 12 calendar.set(calendar.YEAR, yearList.get(0)); 13 14 System.out.println(calendar.get(calendar.YEAR)); 15 16 for (int i = 0; i < monthList.size(); i++) { 17 18 System.out.println(monthList.get(i)); 19 calendar.set(calendar.MONTH, monthList.get(i)); 20 System.out.println(calendar.get(calendar.MONTH)); 21 /** 22 * 1回目のループ:monthList.get(i) = 4 23 * calendar.get(calendar.MONTH) = 4 24 * 2回目のループ:monthList.get(i) = 5 25 * calendar.get(calendar.MONTH) = 6 26 * 27 * 2回目のループでcalendar.get(calendar.MONTH) = 6と 28 * なってしまう原因が分からない。 29 */ 30 switch (calendar.get(calendar.MONTH)) { 31 case (0): 32 System.out.println("1月"); 33 break; 34 case (1): 35 System.out.println("2月"); 36 break; 37 case (2): 38 System.out.println("3月"); 39 break; 40 case (3): 41 System.out.println("4月"); 42 break; 43 case (4): 44 System.out.println("5月"); 45 break; 46 case (5): 47 System.out.println("6月"); 48 break; 49 case (6): 50 System.out.println("7月"); 51 break; 52 case (7): 53 System.out.println("8月"); 54 break; 55 case (8): 56 System.out.println("9月"); 57 break; 58 case (9): 59 System.out.println("10月"); 60 break; 61 case (10): 62 System.out.println("11月"); 63 break; 64 case (11): 65 System.out.println("12月"); 66 break; 67 } 68 69 for (int j = 1; j <= calendar.getActualMaximum(calendar.DATE); j++) { 70 71 calendar.set(calendar.DATE, j); 72 System.out.println(calendar.get(calendar.DATE)); 73 74 switch (calendar.get(calendar.DAY_OF_WEEK)) { 75 case (1): 76 System.out.println("日曜日"); 77 break; 78 case (2): 79 System.out.println("月曜日"); 80 break; 81 case (3): 82 System.out.println("火曜日"); 83 break; 84 case (4): 85 System.out.println("水曜日"); 86 break; 87 case (5): 88 System.out.println("木曜日"); 89 break; 90 case (6): 91 System.out.println("金曜日"); 92 break; 93 case (7): 94 System.out.println("土曜日"); 95 break; 96 } 97 } 98 } 99 }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

ループ2週目にてmonthに'5'をセットする直前のcalendarは、「5月31日」です。
この状態でmonthだけ'5'をセットすると、calendarは「6月31日」になります。
しかし、6月は30日までで31日は存在しませんよね。
この状態を是正するため、calendarは6月30日の次の日、すなわち7月1日になります。

上記の理由により、月がずれているように見えます。
月をセットする前に日を一日に戻すなりすれば、この現象は起こらなくなります。

投稿2020/05/17 07:36

hope_mucci

総合スコア4447

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yosikawa

2020/05/17 07:50

大変ご丁寧で分かりやすい解説をありがとうございます。 ご指摘の通り、月ごとの日付の出力が終わった時点で Calendarに存在する日付をセットすることで望んでいた結果になりました。 繰り返しとなりますが、ご回答いただきありがとうございました。
swordone

2020/05/17 07:55

この動作を直感的にしたいなら、LocalDateを使ったほうがよいでしょう。
guest

0

月ごとの日付の出力が終わった段階で
Calendarの日付に存在する日付をセットする。

投稿2020/05/17 07:51

yosikawa

総合スコア14

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問