tl; dr
HijrahDate
.from
(
LocalDate.of( 2020 , Month.JANUARY , 23 )
)
.plus
(
Period.ofDays( 5 )
)
.isBefore
(
someOtherDate
)
Подробности
Современный подход использует классы java .time , встроенные в Java 8 и более поздние версии, и Android 26 и позже. Для более ранних версий см. Проекты ThreeTen-Backport и ThreeTenABP .
Проект Joda-Time является предшественником java .time . Оба основаны и возглавляются одним и тем же человеком, Стивеном Коулборном.
HijrahChronology
является частью java .time . HijrahChronology
следует правилам календарной системы хиджры. Календарь хиджры - это лунный календарь с поддержкой календарей Ислами c.
Класс HijrahDate
представляет дату в системе календаря хиджры.
Переполнение стека поиска в узнайте больше, так как это уже неоднократно освещалось.
Я не эксперт по ислами c календарям или HijrahChronology
, но я считаю, что вы можете конвертировать между датой хиджры и григорианской (prolepti *) 1126 *) дату, вызвав метод from
для классов HijrahDate
и LocalDate
.
LocalDate localDate1 = LocalDate.of( 2020 , Month.JANUARY , 23 ) ;
HijrahDate hijrahDate = HijrahDate.from( localDate1 ) ;
… и…
LocalDate localDate2 = LocalDate.from( hijrahDate ) ;
Оба класса даты предлагают plus
и minus
методы, которые принимают объект Period
.
LocalDate later = localDate2.plus( Period.ofDays( 5 ) ) ;
Сравните с isEqual
, isBefore
и isAfter
.
boolean match = localDate1.isEqual( localDate2 ) ;
Дамп на консоль.
System.out.println( "localDate1.toString(): " + localDate1 ) ;
System.out.println( "hijrahDate.toString(): " + hijrahDate ) ;
System.out.println( "localDate2.toString(): " + localDate2 ) ;
System.out.println( "match: " + localDate1.isEqual( localDate2 ) ) ;
System.out.println( "later.toString(): " + later ) ;
См. Этот код, запущенный в режиме реального времени на IdeOne.com .
localDate1.toString (): 2020-01-23
hijrahDate.toString (): Hijrah-umalqura AH 1441-05-28
localDate2.toString (): 2020-01-23
match: true
Later.toString (): 2020-01-28 * 1 073 *
Вот полный пример. Используемый здесь метод сравнения для промежутка времени - Half-Open, где начало включительно , а окончание exclusive . Такой подход обычно лучше всего подходит для обработки даты и времени. Этот подход позволяет диапазонам дат аккуратно прилегать друг к другу без пропусков или перекрытий.
LocalDate localDate = LocalDate.of( 2020 , Month.JANUARY , 23 );
HijrahDate hijrahDate = HijrahDate.from( localDate );
// Target range is five days before and after some specific date.
HijrahDate target = HijrahDate.from( LocalDate.of( 2020 , Month.MARCH , 14 ) );
Period period = Period.ofDays( 5 );
LocalDate start = LocalDate.from( target ).minus( period );
LocalDate end = LocalDate.from( target ).plus( period );
// Tip: A shorter way of asking "Is equal to or later" is "Is not before".
boolean withinTargetRange = ( ! hijrahDate.isBefore( start ) ) && hijrahDate.isBefore( end );
Дамп в консоль.
System.out.println( "localDate = " + localDate );
System.out.println( "hijrahDate = " + hijrahDate );
System.out.println( "target = " + target );
System.out.println( "withinTargetRange = " + withinTargetRange );
localDate = 2020-01-23
hijrahDate = Hijrah-umalqura AH 1441-05-28
target = Hijrah-umalqura AH 1441-07-19
WithinTargetRange = false
ThreeTen-Extra
Если вы выполняете большую часть этой работы, я предлагаю добавить библиотеку ThreeTen-Extra , также основанную и возглавляемую Стивеном Коулборном. Класс LocalDateRange
в этой библиотеке представляет промежуток времени в виде пары LocalDate
объектов. Этот класс включает такие методы, как contains
, abuts
, overlaps
и другие. Я не знаю, насколько хорошо эта библиотека работает в Android. Если вы плохо работаете в Android, возможно, вы захотите вставить копию исходного кода класса в свою кодовую базу, при условии, что вы можете соблюдать условия его лицензии BSD-3 .
Вот пример использования LocalDateRange::contains
.
LocalDate localDate = LocalDate.of( 2020 , Month.JANUARY , 23 );
HijrahDate hijrahDate = HijrahDate.from( localDate );
HijrahDate target = HijrahDate.from( LocalDate.of( 2020 , Month.MARCH , 14 ) );
Period period = Period.ofDays( 5 );
LocalDate start = LocalDate.from( target ).minus( period );
LocalDate end = LocalDate.from( target ).plus( period );
LocalDateRange range = LocalDateRange.of( start , end );
boolean withinTargetRange = range.contains( LocalDate.from( hijrahDate ) );
localDate = 2020-01-23
hijrahDate = Hijrah-umalqura AH 1441-05-28
target = Hijrah-umalqura AH 1441-07-19
range = 2020-03-09/2020-03-19
withinTargetRange = false