import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.Month;
import java.time.format.TextStyle;
import java.time.temporal.TemporalAdjusters;
import java.time.temporal.WeekFields;
import java.util.Locale;
public class Main {
public static void main
(String[] args
) { // Test
System.
out.
println(getWeeks
(2021,
7,
new Locale("pt",
"BR")));
System.
out.
println("---------------------------------------------------------");
System.
out.
println(getWeeks
(2021,
2,
new Locale("pt",
"BR")));
System.
out.
println("---------------------------------------------------------");
System.
out.
println(getWeeks
(2021,
7,
new Locale("en",
"GB")));
System.
out.
println("---------------------------------------------------------");
System.
out.
println(getWeeks
(2021,
2,
new Locale("en",
"GB"))); }
static String getWeeks
(int year,
int month,
Locale locale
) { DayOfWeek firstDayOfWeek = WeekFields.of(locale).getFirstDayOfWeek();
LocalDate firstDateOfMonth = LocalDate.of(year, month, 1);
String monthName
= Month.
of(month
).
getDisplayName(TextStyle.
FULL,
Locale.
ENGLISH); int lastDayOfMonth = firstDateOfMonth.with(TemporalAdjusters.lastDayOfMonth()).getDayOfMonth();
int firstDay = 1;
int lastDayOfFirstWeek = LocalDate.of(year, month, 1).with(TemporalAdjusters.nextOrSame(firstDayOfWeek))
.getDayOfMonth();
int lastDay = lastDayOfFirstWeek == 1 ? 7 : lastDayOfFirstWeek - 1;
int i;
StringBuilder sb = new StringBuilder();
for (i = 1; i <= lastDayOfMonth / 7; i++) {
sb.
append(String.
format("Year %d - Month %d (%s) - Week %d - First day: %d - Last Day: %d%n", year, month,
monthName, i, firstDay, lastDay));
firstDay = lastDay + 1;
lastDay += 7;
}
if (lastDayOfFirstWeek != 1 && lastDayOfMonth >= 28)
sb.
append(String.
format("Year %d - Month %d (%s) - Week %d - First day: %d - Last Day: %d%n", year, month,
monthName, i, firstDay, lastDayOfMonth));
return sb.toString();
}
}
aW1wb3J0IGphdmEudGltZS5EYXlPZldlZWs7CmltcG9ydCBqYXZhLnRpbWUuTG9jYWxEYXRlOwppbXBvcnQgamF2YS50aW1lLk1vbnRoOwppbXBvcnQgamF2YS50aW1lLmZvcm1hdC5UZXh0U3R5bGU7CmltcG9ydCBqYXZhLnRpbWUudGVtcG9yYWwuVGVtcG9yYWxBZGp1c3RlcnM7CmltcG9ydCBqYXZhLnRpbWUudGVtcG9yYWwuV2Vla0ZpZWxkczsKaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CgpwdWJsaWMgY2xhc3MgTWFpbiB7CglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CgkJLy8gVGVzdAoJCVN5c3RlbS5vdXQucHJpbnRsbihnZXRXZWVrcygyMDIxLCA3LCBuZXcgTG9jYWxlKCJwdCIsICJCUiIpKSk7CgoJCVN5c3RlbS5vdXQucHJpbnRsbigiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7CgoJCVN5c3RlbS5vdXQucHJpbnRsbihnZXRXZWVrcygyMDIxLCAyLCBuZXcgTG9jYWxlKCJwdCIsICJCUiIpKSk7CgoJCVN5c3RlbS5vdXQucHJpbnRsbigiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7CgoJCVN5c3RlbS5vdXQucHJpbnRsbihnZXRXZWVrcygyMDIxLCA3LCBuZXcgTG9jYWxlKCJlbiIsICJHQiIpKSk7CgoJCVN5c3RlbS5vdXQucHJpbnRsbigiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7CgoJCVN5c3RlbS5vdXQucHJpbnRsbihnZXRXZWVrcygyMDIxLCAyLCBuZXcgTG9jYWxlKCJlbiIsICJHQiIpKSk7Cgl9CgoJc3RhdGljIFN0cmluZyBnZXRXZWVrcyhpbnQgeWVhciwgaW50IG1vbnRoLCBMb2NhbGUgbG9jYWxlKSB7CgkJRGF5T2ZXZWVrIGZpcnN0RGF5T2ZXZWVrID0gV2Vla0ZpZWxkcy5vZihsb2NhbGUpLmdldEZpcnN0RGF5T2ZXZWVrKCk7CgkJTG9jYWxEYXRlIGZpcnN0RGF0ZU9mTW9udGggPSBMb2NhbERhdGUub2YoeWVhciwgbW9udGgsIDEpOwoJCVN0cmluZyBtb250aE5hbWUgPSBNb250aC5vZihtb250aCkuZ2V0RGlzcGxheU5hbWUoVGV4dFN0eWxlLkZVTEwsIExvY2FsZS5FTkdMSVNIKTsKCQlpbnQgbGFzdERheU9mTW9udGggPSBmaXJzdERhdGVPZk1vbnRoLndpdGgoVGVtcG9yYWxBZGp1c3RlcnMubGFzdERheU9mTW9udGgoKSkuZ2V0RGF5T2ZNb250aCgpOwoKCQlpbnQgZmlyc3REYXkgPSAxOwoJCWludCBsYXN0RGF5T2ZGaXJzdFdlZWsgPSBMb2NhbERhdGUub2YoeWVhciwgbW9udGgsIDEpLndpdGgoVGVtcG9yYWxBZGp1c3RlcnMubmV4dE9yU2FtZShmaXJzdERheU9mV2VlaykpCgkJCQkuZ2V0RGF5T2ZNb250aCgpOwoJCWludCBsYXN0RGF5ID0gbGFzdERheU9mRmlyc3RXZWVrID09IDEgPyA3IDogbGFzdERheU9mRmlyc3RXZWVrIC0gMTsKCgkJaW50IGk7CgkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CgoJCWZvciAoaSA9IDE7IGkgPD0gbGFzdERheU9mTW9udGggLyA3OyBpKyspIHsKCQkJc2IuYXBwZW5kKFN0cmluZy5mb3JtYXQoIlllYXIgJWQgLSBNb250aCAlZCAoJXMpIC0gV2VlayAlZCAtIEZpcnN0IGRheTogJWQgLSBMYXN0IERheTogJWQlbiIsIHllYXIsIG1vbnRoLAoJCQkJCW1vbnRoTmFtZSwgaSwgZmlyc3REYXksIGxhc3REYXkpKTsKCQkJZmlyc3REYXkgPSBsYXN0RGF5ICsgMTsKCQkJbGFzdERheSArPSA3OwoJCX0KCgkJaWYgKGxhc3REYXlPZkZpcnN0V2VlayAhPSAxICYmIGxhc3REYXlPZk1vbnRoID49IDI4KQoJCQlzYi5hcHBlbmQoU3RyaW5nLmZvcm1hdCgiWWVhciAlZCAtIE1vbnRoICVkICglcykgLSBXZWVrICVkIC0gRmlyc3QgZGF5OiAlZCAtIExhc3QgRGF5OiAlZCVuIiwgeWVhciwgbW9udGgsCgkJCQkJbW9udGhOYW1lLCBpLCBmaXJzdERheSwgbGFzdERheU9mTW9udGgpKTsKCgkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Cgl9Cn0=