import java.util.*;
import java.time.*;
import java.time.format.DateTimeFormatter;
class DisplayCalendar {
static Scanner scanner
= new Scanner
(System.
in);
static int inputNumber
(String message,
int min,
int max
) { while(true) {
String str
= scanner.
nextLine(); try {
int number
= Integer.
parseInt(str
); if (min <= number && number <= max) {
return number;
}
System.
out.
println("正しい入力ではありません。"); }
}
}
YearMonth yearMonth = YearMonth.of(year, month);
DateTimeFormatter titleFormat = DateTimeFormatter.ofPattern(" y年 M月\n");
buffer.append(yearMonth.format(titleFormat));
buffer.append("日 月 火 水 木 金 土\n");
DayOfWeek firstDayOfMonth = yearMonth.atDay(1).getDayOfWeek();
int numberOfSpace = firstDayOfMonth.getValue() % 7 * 3;
buffer.
append(String.
format("%-" + numberOfSpace
+ "s",
""));
for (int day = 1, length = yearMonth.lengthOfMonth(); day <= length; day++) {
buffer.
append(String.
format("%2d ", day
)); if (yearMonth.atDay(day).getDayOfWeek() == DayOfWeek.SATURDAY) {
buffer.append("\n");
}
}
return buffer;
}
public static void main
(String[] args
) { DateTimeFormatter todayFormat = DateTimeFormatter.ofPattern("今日はyyyy年MM月dd日です。");
System.
out.
println(LocalDate.
now().
format(todayFormat
));
int year = inputNumber("何年のカレンダーを見ますか?%d~%dまでの数字を入力して下さい。", 2000, 2040);
int month = inputNumber("何月のカレンダーを見ますか?%d~%dまでの数字を入力して下さい。", 1, 12);
System.
out.
println(generateCalender
(year, month
)); }
}
aW1wb3J0IGphdmEudXRpbC4qOwppbXBvcnQgamF2YS50aW1lLio7CmltcG9ydCBqYXZhLnRpbWUuZm9ybWF0LkRhdGVUaW1lRm9ybWF0dGVyOwoKY2xhc3MgRGlzcGxheUNhbGVuZGFyIHsKCXN0YXRpYyBTY2FubmVyIHNjYW5uZXIgPSBuZXcgU2Nhbm5lcihTeXN0ZW0uaW4pOwoKCXN0YXRpYyBpbnQgaW5wdXROdW1iZXIoU3RyaW5nIG1lc3NhZ2UsIGludCBtaW4sIGludCBtYXgpIHsKCQl3aGlsZSh0cnVlKSB7CiAJCQlTeXN0ZW0ub3V0LnByaW50KFN0cmluZy5mb3JtYXQobWVzc2FnZSArICI+ICIsIG1pbiwgbWF4KSk7CgkJCVN0cmluZyBzdHIgPSBzY2FubmVyLm5leHRMaW5lKCk7CgkJCVN5c3RlbS5vdXQucHJpbnRsbihzdHIpOwoJCQl0cnkgewoJCQkJaW50IG51bWJlciA9IEludGVnZXIucGFyc2VJbnQoc3RyKTsKCQkJCWlmIChtaW4gPD0gbnVtYmVyICYmIG51bWJlciA8PSBtYXgpIHsKCQkJCQlyZXR1cm4gbnVtYmVyOwoJCQkJfQoJCQkJdGhyb3cgbmV3IE51bWJlckZvcm1hdEV4Y2VwdGlvbigpOwoJCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewoJICAgCQkJU3lzdGVtLm91dC5wcmludGxuKCLmraPjgZfjgYTlhaXlipvjgafjga/jgYLjgorjgb7jgZvjgpPjgIIiKTsKCQkJfQoJCX0KCX0KCQoJc3RhdGljIFN0cmluZ0J1ZmZlciBnZW5lcmF0ZUNhbGVuZGVyKGludCB5ZWFyLCBpbnQgbW9udGgpIHsKCQlZZWFyTW9udGggeWVhck1vbnRoID0gWWVhck1vbnRoLm9mKHllYXIsIG1vbnRoKTsKCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwoKCQlEYXRlVGltZUZvcm1hdHRlciB0aXRsZUZvcm1hdCA9IERhdGVUaW1lRm9ybWF0dGVyLm9mUGF0dGVybigiICAgICB55bm0IE3mnIhcbiIpOwoJCWJ1ZmZlci5hcHBlbmQoeWVhck1vbnRoLmZvcm1hdCh0aXRsZUZvcm1hdCkpOwoKCQlidWZmZXIuYXBwZW5kKCLml6Ug5pyIIOeBqyDmsLQg5pyoIOmHkSDlnJ9cbiIpOwoKCQlEYXlPZldlZWsgZmlyc3REYXlPZk1vbnRoID0geWVhck1vbnRoLmF0RGF5KDEpLmdldERheU9mV2VlaygpOwoJCWludCBudW1iZXJPZlNwYWNlID0gZmlyc3REYXlPZk1vbnRoLmdldFZhbHVlKCkgJSA3ICogMzsKCQlidWZmZXIuYXBwZW5kKFN0cmluZy5mb3JtYXQoIiUtIiArIG51bWJlck9mU3BhY2UgKyAicyIsICIiKSk7CgoJCWZvciAoaW50IGRheSA9IDEsIGxlbmd0aCA9IHllYXJNb250aC5sZW5ndGhPZk1vbnRoKCk7IGRheSA8PSBsZW5ndGg7IGRheSsrKSB7CgkJCWJ1ZmZlci5hcHBlbmQoU3RyaW5nLmZvcm1hdCgiJTJkICIsIGRheSkpOwoJCQlpZiAoeWVhck1vbnRoLmF0RGF5KGRheSkuZ2V0RGF5T2ZXZWVrKCkgPT0gRGF5T2ZXZWVrLlNBVFVSREFZKSB7CgkJCQlidWZmZXIuYXBwZW5kKCJcbiIpOwoJCQl9CgkJfQoKCQlyZXR1cm4gYnVmZmVyOwoJfQoJCglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CgkJRGF0ZVRpbWVGb3JtYXR0ZXIgdG9kYXlGb3JtYXQgPSBEYXRlVGltZUZvcm1hdHRlci5vZlBhdHRlcm4oIuS7iuaXpeOBr3l5eXnlubRNTeaciGRk5pel44Gn44GZ44CCIik7CgkJU3lzdGVtLm91dC5wcmludGxuKExvY2FsRGF0ZS5ub3coKS5mb3JtYXQodG9kYXlGb3JtYXQpKTsKCgkJaW50IHllYXIgPSBpbnB1dE51bWJlcigi5L2V5bm044Gu44Kr44Os44Oz44OA44O844KS6KaL44G+44GZ44GL77yfJWTvvZ4lZOOBvuOBp+OBruaVsOWtl+OCkuWFpeWKm+OBl+OBpuS4i+OBleOBhOOAgiIsIDIwMDAsIDIwNDApOwoJCWludCBtb250aCA9IGlucHV0TnVtYmVyKCLkvZXmnIjjga7jgqvjg6zjg7Pjg4Djg7zjgpLopovjgb7jgZnjgYvvvJ8lZO+9niVk44G+44Gn44Gu5pWw5a2X44KS5YWl5Yqb44GX44Gm5LiL44GV44GE44CCIiwgMSwgMTIpOwoKCQlTeXN0ZW0ub3V0LnByaW50bG4oZ2VuZXJhdGVDYWxlbmRlcih5ZWFyLCBtb250aCkpOwoJfQp9Cg==