您想使用哪种回历版本?
如果您选择沙特阿拉伯的官方日历,那么解决方案基于java.time.HijrahDate会工作。但此类在 Android 上至少需要 API 级别 26。例子:
HijrahDate hd1 = HijrahDate.now();
HijrahDate hd2 = HijrahDate.from(LocalDate.of(2020, 5, 1));
long days = ChronoUnit.DAYS.between(hd1, hd2);
还有一些比较方法,例如isAfter()
or isBefore()
从接口继承ChronoLocalDate
和标准 plus() 方法,以确定您的日期是否在特定时间段内。
向后移植java.time
:
还有一个名为三十ABP适用于较低的 Android 版本。但要注意其实施的陷阱HijrahDate
不同,并且不使用沙特阿拉伯的日历(因此您必须容忍日期转换的差异)。
关于乔达时间:
如果您选择该(相当过时的)库,那么您应该选择该库版本适合安卓。然而,它也不支持沙特阿拉伯的日历,但提供了四种不同的其他变体。您需要指定算法闰年模式.
ICU4J(嵌入Android):
其类别伊斯兰历提供类似于旧日历类的样式java.util.Calendar
还有几个变体,包括沙特阿拉伯的变体。所需的最低 API 级别为 24。
Time4A:
那是我自己写的一个库(如Android 版 Time4J 的适配)。它提供了类回历有多种变体,包括 Joda 变体,但也包括沙特阿拉伯日历(变体 ummalqura)。它提供了所有需要的功能,例如日期算术(通过 plus() 或 minus() 方法)、日期比较(通过 isAfter() 等)。例子:
String variant = HijriCalendar.VARIANT_UMALQURA;
StartOfDay startOfDay = StartOfDay.definedBy(SolarTime.ofMecca().sunset());
HijriCalendar today = HijriCalendar.nowInSystemTime(variant, startOfDay);
HijriCalendar hcal = // gregorian to Hijri conversion
PlainDate.of(2020, 5, 1).transform(HijriCalendar.class, variant);
long days = CalendarDays.between(today, hcal).getAmount();
其他库不支持诸如日落作为一天的开始之类的功能。 Muharram +- 5days 请求的示例可能如下所示:
CalendarDays tolerance = CalendarDays.of(5);
HijriCalendar htemp = today.with(HijriCalendar.MONTH_OF_YEAR, HijriMonth.MUHARRAM);
HijriCalendar h1 = htemp.with(HijriCalendar.DAY_OF_MONTH.minimized()).minus(tolerance);
HijriCalendar h2 = htemp.with(HijriCalendar.DAY_OF_MONTH.maximized()).plus(tolerance);
boolean inTimePeriod = !(today.isBefore(h1) || today.isAfter(h2));