如何从回历日期转换为格鲁吉亚日期,反之亦然

Vis*_*nge 3 java android calendar date hijri

我正在寻找一种方法来计算例如从现在到特定日期有多少天,并且我可以用它来确定我是否处于特定时间段(例如 Muharram +- 5 天)

我已经找了 10 多个小时了,我找到的最好的东西是“HijrahDate”库“java.time.chrono.HijrahDate”和一个叫做“Joda Date”的东西,我很难使用它。

Men*_*ild 5

您想使用回历的哪个变体?

如果您选择沙特阿拉伯的官方日历,那么基于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)