首页 > 解决方案 > 如何从回历日期转换为格鲁吉亚日期,反之亦然

问题描述

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

我一直在寻找超过 10 个小时,我发现最好的东西是“HijrahDate”库“java.time.chrono.HijrahDate”和一个叫做“Joda Date”的东西,我很难使用。

标签: javaandroiddatecalendarhijri

解决方案


您想使用哪种回历变体?

如果您选择沙特阿拉伯的官方日历,那么基于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()isBefore()继承自接口ChronoLocalDate和标准 plus() 方法,以确定您的日期是否在特定时间段内。

向后移植java.time

对于较低的 Android 版本,还有一个名为ThreetenABP的反向移植。但请注意其实施HijrahDate方式不同且不使用沙特阿拉伯日历的陷阱(因此您必须容忍日期转换的差异)。

关于乔达时间:

如果您选择那个(相当过时的)库,那么您应该选择适用于 android的库版本。但是,它也不支持沙特阿拉伯的日历,但提供了四种不同的其他变体。您需要指定算法闰年模式

ICU4J(嵌入安卓):

它的伊斯兰日历类提供类似于旧日历类的样式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();

其他库不支持日落作为一天的开始等功能。您的 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));

推荐阅读