回答編集履歴

2

コード等追加

2022/07/16 18:22

投稿

jimbe
jimbe

スコア12648

test CHANGED
@@ -121,3 +121,23 @@
121
121
  18 19 20 21 22 23 24
122
122
  25 26 27 28 29 30 31
123
123
  ```
124
+ ---
125
+ コメントに書いた、 i に下駄を履かせる(「0~(月初の曜日値-1) は前月を表す」)としたら…です。
126
+ (ご質問のコードの一部)
127
+ ```java
128
+ //月初日が何曜日なのか設定
129
+ int startDay = cal.get(java.util.Calendar.DAY_OF_WEEK) - 1; //0=日曜, 1=月曜, ..., 6=土曜
130
+ int lastDay = cal.getActualMaximum(java.util.Calendar.DATE);
131
+
132
+ for(int i = 0; i < startDay + lastDay; i++){
133
+ if(i > 0 && i%7 == 0){
134
+ System.out.println();
135
+ }
136
+
137
+ if(i < startDay){
138
+ System.out.print(" ");
139
+ } else {
140
+ System.out.printf(" %2d", (i - startDay + 1));
141
+ }
142
+ }
143
+ ```

1

コード追加等

2022/07/16 13:57

投稿

jimbe
jimbe

スコア12648

test CHANGED
@@ -1 +1,123 @@
1
- 例えば、 Calender には日付に加算する機能があり、必要なら内部の月や曜日等を自動で更新してくれます。これを利用すると、カレンダーを「月の開始日の属する週の日曜日」に設定し、その日から日付を1ずつ足していって月を調べ、表示対象月なら日を表示、対象月で無ければスペースを表示し、土曜日の後には改行を行い、月が対象月の翌月になったら終了する・・・といったことが出来ます。
1
+ 例えば、 Calender には日付に加算する機能があり、必要なら内部の月や曜日等を自動で更新してくれます。これを利用すると、カレンダーを「月の開始日の属する週の日曜日」に設定し、その日から日付を1ずつ足していって月を調べ、表示対象月なら日を表示、対象月で無ければスペースを表示し、土曜日表示の後(もしくは日曜の前)には改行を行い、月が対象月の翌月になったら終了する・・・といったことが出来ます。
2
+
3
+ ```java
4
+ import java.util.Calendar;
5
+
6
+ public class カレンダー {
7
+ public static void main(String[] args) {
8
+ for(int month=1; month<=12; month++) print(2022, month);
9
+ }
10
+
11
+ private static void print(int year, int month) {
12
+ System.out.println(year + "年" + month + "月");
13
+ System.out.print(" 日 月 火 水 木 金 土"); //改行しない(後の for で最初に改行するため)
14
+
15
+ for(Calendar cal = getStart(year, month, Calendar.SUNDAY); !isEnd(cal, month); cal.add(Calendar.DATE, 1)) {
16
+ if(cal.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY) System.out.println();
17
+ System.out.printf(cal.get(Calendar.MONTH) == month-1 ? " %2d" : " ", cal.get(Calendar.DATE));
18
+ }
19
+
20
+ System.out.println();
21
+ }
22
+
23
+ private static Calendar getStart(int year, int month, int dayOfWeek) {
24
+ Calendar cal = Calendar.getInstance();
25
+ cal.set(year, month-1, 1);
26
+ while(cal.get(Calendar.DAY_OF_WEEK) != dayOfWeek) cal.add(Calendar.DATE, -1); //指定曜日まで戻る
27
+ return cal;
28
+ }
29
+
30
+ private static boolean isEnd(Calendar cal, int month) {
31
+ return cal.get(Calendar.MONTH) != month-1 && cal.get(Calendar.DATE) == 1;
32
+ }
33
+ }
34
+ ```
35
+ ```plain
36
+ 2022年1月
37
+ 日 月 火 水 木 金 土
38
+ 1
39
+ 2 3 4 5 6 7 8
40
+ 9 10 11 12 13 14 15
41
+ 16 17 18 19 20 21 22
42
+ 23 24 25 26 27 28 29
43
+ 30 31
44
+ 2022年2月
45
+ 日 月 火 水 木 金 土
46
+ 1 2 3 4 5
47
+ 6 7 8 9 10 11 12
48
+ 13 14 15 16 17 18 19
49
+ 20 21 22 23 24 25 26
50
+ 27 28
51
+ 2022年3月
52
+ 日 月 火 水 木 金 土
53
+ 1 2 3 4 5
54
+ 6 7 8 9 10 11 12
55
+ 13 14 15 16 17 18 19
56
+ 20 21 22 23 24 25 26
57
+ 27 28 29 30 31
58
+ 2022年4月
59
+ 日 月 火 水 木 金 土
60
+ 1 2
61
+ 3 4 5 6 7 8 9
62
+ 10 11 12 13 14 15 16
63
+ 17 18 19 20 21 22 23
64
+ 24 25 26 27 28 29 30
65
+ 2022年5月
66
+ 日 月 火 水 木 金 土
67
+ 1 2 3 4 5 6 7
68
+ 8 9 10 11 12 13 14
69
+ 15 16 17 18 19 20 21
70
+ 22 23 24 25 26 27 28
71
+ 29 30 31
72
+ 2022年6月
73
+ 日 月 火 水 木 金 土
74
+ 1 2 3 4
75
+ 5 6 7 8 9 10 11
76
+ 12 13 14 15 16 17 18
77
+ 19 20 21 22 23 24 25
78
+ 26 27 28 29 30
79
+ 2022年7月
80
+ 日 月 火 水 木 金 土
81
+ 1 2
82
+ 3 4 5 6 7 8 9
83
+ 10 11 12 13 14 15 16
84
+ 17 18 19 20 21 22 23
85
+ 24 25 26 27 28 29 30
86
+ 31
87
+ 2022年8月
88
+ 日 月 火 水 木 金 土
89
+ 1 2 3 4 5 6
90
+ 7 8 9 10 11 12 13
91
+ 14 15 16 17 18 19 20
92
+ 21 22 23 24 25 26 27
93
+ 28 29 30 31
94
+ 2022年9月
95
+ 日 月 火 水 木 金 土
96
+ 1 2 3
97
+ 4 5 6 7 8 9 10
98
+ 11 12 13 14 15 16 17
99
+ 18 19 20 21 22 23 24
100
+ 25 26 27 28 29 30
101
+ 2022年10月
102
+ 日 月 火 水 木 金 土
103
+ 1
104
+ 2 3 4 5 6 7 8
105
+ 9 10 11 12 13 14 15
106
+ 16 17 18 19 20 21 22
107
+ 23 24 25 26 27 28 29
108
+ 30 31
109
+ 2022年11月
110
+ 日 月 火 水 木 金 土
111
+ 1 2 3 4 5
112
+ 6 7 8 9 10 11 12
113
+ 13 14 15 16 17 18 19
114
+ 20 21 22 23 24 25 26
115
+ 27 28 29 30
116
+ 2022年12月
117
+ 日 月 火 水 木 金 土
118
+ 1 2 3
119
+ 4 5 6 7 8 9 10
120
+ 11 12 13 14 15 16 17
121
+ 18 19 20 21 22 23 24
122
+ 25 26 27 28 29 30 31
123
+ ```