年份数字从公历转换为回历 java time4j

year number convert from gregorian to hijri java time4j

我从用户那里取了一个年号。如何将其转换为回历年数?最好不要使用 jodatime,而是使用 time4j 或 java 8.

示例:我需要从 2016 年开始使用回历年号。

我找到了这个 post, Is there any library or algorithm for Persian (Shamsi or Jalali) calendar in Android?

System.out.println(jalali.transform(PlainDate.class)); // 2015-03-25

但是方法 transform 不起作用。

我还发现 post 可以将回历转换为公历: Get a gregorian date from Hijri date strings

但我需要从公历到回历。

句子“但是方法转换不起作用。”应该读作“不编译”。

原因是 HijriCalendar 代表了一系列不同的变体(例如 Umalqura)。技术背景:这个class继承自CalendarVariant而不是Calendrical。因此,编译器强制您使用 transform() 方法和 TWO arguments。第二个参数指定 HijriCalendar 的变体。示例:

PlainDate today = SystemClock.inLocalView().today();

HijriCalendar umalqura = 
  today.transform(HijriCalendar.class, HijriCalendar.VARIANT_UMALQURA);
HijriCalendar westIslamicCivil = 
  today.transform(HijriCalendar.class, HijriAlgorithm.WEST_ISLAMIC_CIVIL);

System.out.println(umalqura); // AH-1437-07-23[islamic-umalqura]
System.out.println(westIslamicCivil); // AH-1437-07-22[islamic-civil]

此示例还演示了为什么指定变体很重要。您会看到一天的差异(对于相同的公历日期)!实际上 Time4J 支持 11 种变体。 umalquara 变体是沙特阿拉伯的官方日历,而 8 个算法变体应该被解释为近似值并且具有更广泛的有效性范围。

一旦您拥有 HijriCalendar 的实例,您就可以轻松获得回历年份:

int hijriYear = umalqura.getYear();
System.out.println("Year (hirji-umalqura): " + hijriYear); // 1437