import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.YearMonth;
import java.time.format.DateTimeFormatter;
import java.time.temporal.TemporalAdjusters;
import java.time.temporal.WeekFields;
import java.util.Locale;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
public class Main {
public static void main
(String[] args
) { // Let's test
System.
out.
println("-+-+-+-+-+-+-+-+-+-+-+-+-+-"); }
LocalDate localDate = LocalDate.now();
YearMonth ym = YearMonth.of(localDate.getYear(), localDate.getMonthValue());
StringBuilder sb = new StringBuilder();
// First day of week
DayOfWeek firstDayOfWeek = WeekFields.of(locale).getFirstDayOfWeek();
LocalDate date = localDate.with(TemporalAdjusters.dayOfWeekInMonth(0, firstDayOfWeek));
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("EEE", locale);
sb.append(
IntStream.rangeClosed(0, 6)
.mapToObj(i -> dtf.format(date.plusDays(i)))
.collect(Collectors.joining(" "))
)
.
append(System.
lineSeparator());
int counter = 1;
// Print as many space as the difference between the day of week of 1st date of
// the month and the first day of the week in that Locale
int dayValue = localDate.withDayOfMonth(1).getDayOfWeek().getValue() - firstDayOfWeek.getValue();
dayValue = dayValue < 0 ? 7 + dayValue : dayValue;
for (int i = 0; i < dayValue; i++, counter++) {
sb.
append(String.
format("%-4s",
"")); }
for (int i = 1; i <= ym.getMonth().length(ym.isLeapYear()); i++, counter++) {
sb.
append(String.
format("%-4d", i
));
// Break the line if the value of the counter is multiple of 7
if (counter % 7 == 0) {
sb.
append(System.
lineSeparator()); }
}
return sb.toString();
}
}
aW1wb3J0IGphdmEudGltZS5EYXlPZldlZWs7CmltcG9ydCBqYXZhLnRpbWUuTG9jYWxEYXRlOwppbXBvcnQgamF2YS50aW1lLlllYXJNb250aDsKaW1wb3J0IGphdmEudGltZS5mb3JtYXQuRGF0ZVRpbWVGb3JtYXR0ZXI7CmltcG9ydCBqYXZhLnRpbWUudGVtcG9yYWwuVGVtcG9yYWxBZGp1c3RlcnM7CmltcG9ydCBqYXZhLnRpbWUudGVtcG9yYWwuV2Vla0ZpZWxkczsKaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CmltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CmltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkludFN0cmVhbTsKCnB1YmxpYyBjbGFzcyBNYWluIHsKCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKCQkvLyBMZXQncyB0ZXN0CgkJU3lzdGVtLm91dC5wcmludGxuKGdldE1vbnRoQ2FsZW5kYXIoTG9jYWxlLlVLKSk7CgkJU3lzdGVtLm91dC5wcmludGxuKCItKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0iKTsKCQlTeXN0ZW0ub3V0LnByaW50bG4oZ2V0TW9udGhDYWxlbmRhcihMb2NhbGUuVVMpKTsKCX0KCglzdGF0aWMgU3RyaW5nIGdldE1vbnRoQ2FsZW5kYXIoTG9jYWxlIGxvY2FsZSkgewoJCUxvY2FsRGF0ZSBsb2NhbERhdGUgPSBMb2NhbERhdGUubm93KCk7CgkJWWVhck1vbnRoIHltID0gWWVhck1vbnRoLm9mKGxvY2FsRGF0ZS5nZXRZZWFyKCksIGxvY2FsRGF0ZS5nZXRNb250aFZhbHVlKCkpOwoJCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwoKCQkvLyBGaXJzdCBkYXkgb2Ygd2VlawoJCURheU9mV2VlayBmaXJzdERheU9mV2VlayA9IFdlZWtGaWVsZHMub2YobG9jYWxlKS5nZXRGaXJzdERheU9mV2VlaygpOwoKCQlMb2NhbERhdGUgZGF0ZSA9IGxvY2FsRGF0ZS53aXRoKFRlbXBvcmFsQWRqdXN0ZXJzLmRheU9mV2Vla0luTW9udGgoMCwgZmlyc3REYXlPZldlZWspKTsKCQlEYXRlVGltZUZvcm1hdHRlciBkdGYgPSBEYXRlVGltZUZvcm1hdHRlci5vZlBhdHRlcm4oIkVFRSIsIGxvY2FsZSk7CgkJc2IuYXBwZW5kKAoJCQkJCUludFN0cmVhbS5yYW5nZUNsb3NlZCgwLCA2KQoJCQkJCS5tYXBUb09iaihpIC0+IGR0Zi5mb3JtYXQoZGF0ZS5wbHVzRGF5cyhpKSkpCgkJCQkJLmNvbGxlY3QoQ29sbGVjdG9ycy5qb2luaW5nKCIgIikpCgkJKQoJCS5hcHBlbmQoU3lzdGVtLmxpbmVTZXBhcmF0b3IoKSk7CgoJCWludCBjb3VudGVyID0gMTsKCgkJLy8gUHJpbnQgYXMgbWFueSBzcGFjZSBhcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBkYXkgb2Ygd2VlayBvZiAxc3QgZGF0ZSBvZgoJCS8vIHRoZSBtb250aCBhbmQgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2VlayBpbiB0aGF0IExvY2FsZQoJCWludCBkYXlWYWx1ZSA9IGxvY2FsRGF0ZS53aXRoRGF5T2ZNb250aCgxKS5nZXREYXlPZldlZWsoKS5nZXRWYWx1ZSgpIC0gZmlyc3REYXlPZldlZWsuZ2V0VmFsdWUoKTsKCQlkYXlWYWx1ZSA9IGRheVZhbHVlIDwgMCA/IDcgKyBkYXlWYWx1ZSA6IGRheVZhbHVlOwoJCWZvciAoaW50IGkgPSAwOyBpIDwgZGF5VmFsdWU7IGkrKywgY291bnRlcisrKSB7CgkJCXNiLmFwcGVuZChTdHJpbmcuZm9ybWF0KCIlLTRzIiwgIiIpKTsKCQl9CgoJCWZvciAoaW50IGkgPSAxOyBpIDw9IHltLmdldE1vbnRoKCkubGVuZ3RoKHltLmlzTGVhcFllYXIoKSk7IGkrKywgY291bnRlcisrKSB7CgkJCXNiLmFwcGVuZChTdHJpbmcuZm9ybWF0KCIlLTRkIiwgaSkpOwoKCQkJLy8gQnJlYWsgdGhlIGxpbmUgaWYgdGhlIHZhbHVlIG9mIHRoZSBjb3VudGVyIGlzIG11bHRpcGxlIG9mIDcKCQkJaWYgKGNvdW50ZXIgJSA3ID09IDApIHsKCQkJCXNiLmFwcGVuZChTeXN0ZW0ubGluZVNlcGFyYXRvcigpKTsKCQkJfQoJCX0KCgkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Cgl9Cn0=