Как вычесть год хиджры из даты хиджры в Java 8 Date API - PullRequest
0 голосов
/ 24 июня 2018

Я хочу отобразить даты начала и окончания Рамазан 2017. Я попытался написать код, используя HijrahChronology, встроенный в Java 8 и более поздние версии, с классом HijrahDate.

import java.time.LocalDate;
import java.time.chrono.HijrahDate;
import java.time.temporal.ChronoField;
import java.time.temporal.TemporalAdjusters;

public class Ramdan {

    public static void main(String[] args) {

        HijrahDate ramdanDate = HijrahDate.now().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()));

        System.out.println("Ramdan 2017");
        System.out.println(ramdanStart);
        System.out.println(ramdanEnd);
    }

}

Но он, очевидно, печатает даты текущего года, то есть 2018.

выход

Рамдан 2017

2018-05-16

2018-06-14

Я пробовал много вещей, как минус годы, или делал временные корректировки, но ничего не помогало. Может кто-нибудь предложить крутой способ достижения этого?

1 Ответ

0 голосов
/ 24 июня 2018

Я не уверен, что это идеальный способ сделать это, но это работает для меня и не кажется слишком сложным:

    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
...