您想使用回历的哪个变体?
如果您选择沙特阿拉伯的官方日历,那么基于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);
Run Code Online (Sandbox Code Playgroud)
还有一些比较方法,比如isAfter()或isBefore()继承自接口ChronoLocalDate和标准 plus() 方法,以确定您的日期是否在特定时间段内。
向后移植java.time:
还有一个名为ThreetenABP 的反向移植,适用于较低的 Android 版本。但请注意其实施HijrahDate不同并且不使用沙特阿拉伯日历的陷阱(因此您必须容忍日期转换的差异)。
关于乔达时间:
如果您选择那个(相当过时的)库,那么您应该选择适用于 android的库版本。但是,它也不支持沙特阿拉伯的日历,但提供四种不同的其他变体。您需要指定算法闰年模式。
ICU4J(嵌入Android):
它的类IslamCalendar提供了类似于旧日历类的样式java.util.Calendar以及包括沙特阿拉伯在内的几种变体。所需的最低 API 级别为 24。
时间4A:
那是我自己写的一个库(作为Time4J for Android 的改编版)。它提供了具有多种变体的HijriCalendar类,包括 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();
Run Code Online (Sandbox Code Playgroud)
其他库不支持日落作为一天的开始等功能。您的 Muharram +- 5days-request 示例可能如下所示:
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));
Run Code Online (Sandbox Code Playgroud)