Я не уверен, что это идеальный способ сделать это, но это работает для меня и не кажется слишком сложным:
ramdanDate = ramdanDate.with(ChronoField.YEAR, ramdanDate.get(ChronoField.YEAR) - 1);
С этой строкой, вставленной перед преобразованием в LocalDate
Ваш код теперь печатает:
Ramdan 2017
2017-05-27
2017-06-24
Редактировать:
Предположим, даже если (в случае, если у вас есть григорианский год, который перекрывается двумя экземплярами Рамадана,найти оба) желательно ... Я не могу придумать, как этого добиться.Можете ли вы предложить?
Держите язык прямо во рту:
public static void printRamdanDates(int gregorianYear) {
LocalDate gregDate = LocalDate.ofYearDay(gregorianYear, 1);
HijrahDate ramdanDate = HijrahDate.from(gregDate)
.with(ChronoField.DAY_OF_MONTH, 1)
.with(ChronoField.MONTH_OF_YEAR, 9);
LocalDate ramdanStart = LocalDate.from(ramdanDate);
LocalDate ramdanEnd = LocalDate.from(ramdanDate.with(TemporalAdjusters.lastDayOfMonth()));
// if in previous Gregorian year, skip
while (ramdanEnd.getYear() < gregorianYear) {
ramdanDate = ramdanDate.with(ChronoField.YEAR, ramdanDate.get(ChronoField.YEAR) + 1);
ramdanStart = LocalDate.from(ramdanEnd);
ramdanEnd = LocalDate.from(ramdanDate.with(TemporalAdjusters.lastDayOfMonth()));
}
if (ramdanStart.getYear() > gregorianYear) { // in following Gregorian year
System.out.println("No Ramdan in " + gregorianYear);
} else {
System.out.println("Ramdan " + gregorianYear);
do {
System.out.println(ramdanStart);
System.out.println(ramdanEnd);
ramdanDate = ramdanDate.with(ChronoField.YEAR, ramdanDate.get(ChronoField.YEAR) + 1);
ramdanStart = LocalDate.from(ramdanDate);
ramdanEnd = LocalDate.from(ramdanDate.with(TemporalAdjusters.lastDayOfMonth()));
} while (ramdanStart.getYear() == gregorianYear);
}
}
Если я кормлю 2017 год вышеуказанным методом, это дает тот же результат, что и раньше:
printRamdanDates(2017);
Вывод:
Ramdan 2017
2017-05-27
2017-06-24
Но попробуйте, например, 2000 или 2030 год, когда Рамадан происходит дважды в год по григорианскому / ISO.
printRamdanDates(2000);
printRamdanDates(2030);
Вывод:
Ramdan 2000
1999-12-09
2000-01-07
2000-11-27
2000-12-26
Ramdan 2030
2030-01-05
2030-02-03
2030-12-26
2031-01-23