当前位置: 首页 > 知识库问答 >
问题:

将格里高利日期转换为希吉日日期时出错(Android Studio)

郗丰
2023-03-14

我正在开发一个需要Hijri Date的应用程序,我使用了这里发布的内容将gregorian转换为Hijri Date。

它对我有用,但它给出了错误的日期,例如,当公历是2016年9月20日时,它在Hijri变成了1437年12月17日,这是错误的,它应该是1437年12月19日。

问题出在哪里?

共有1个答案

韦繁
2023-03-14

关于您的转换示例,在我看来,您正在寻找回历的Umalqura变体,这是沙特阿拉伯的官方日历。

你发布的SO链接指的是Joda Time。该库不支持umalqura,但支持Hijri日历的四种算法变体(仅适用于近似值)。我已经测试了所有四种受支持的变体。没有一个是给你的。

Chronology iso = ISOChronology.getInstanceUTC();
Chronology hijri =
    IslamicChronology.getInstance(DateTimeZone.UTC, IslamicChronology.LEAP_YEAR_INDIAN);
LocalDate todayIso = new LocalDate(2016, 9, 20, iso);
LocalDate todayHijri = new LocalDate(todayIso.toDateTimeAtStartOfDay(), hijri);
System.out.println("joda=" + todayHijri);
// LEAP_YEAR_15_BASED => 1437-12-16
// LEAP_YEAR_16_BASED => 1437-12-16
// LEAP_YEAR_HABASH_AL_HASIB => 1437-12-17
// LEAP_YEAR_INDIAN => 1437-12-17

如果您在Java-8平台上操作,那么您可以使用以下解决方案。但是,如果您在Android上并尝试使用backport ThreetenABP,那么这将失败,因为它的实现偏离Java-8:

HijrahDate hd = HijrahDate.from(LocalDate.of(2016, 9, 20));
System.out.println("java.time=" + hd); // Hijrah-umalqura AH 1437-12-19

如果您想要更多日历功能,比如其他版本或可变的一天开始时间(伊斯兰日从日落开始!)或者,如果你在Android系统上操作,那么你可以使用我的Time4J/A库。Time4J(或Android系统上的Time4A)的HijriCalendar可以提供你想要的:

System.out.println(
  PlainDate.of(2016, 9, 20)
    .transform(HijriCalendar.class, HijriCalendar.VARIANT_UMALQURA)); 
// AH-1437-12-19[islamic-umalqura]

请注意,最后一个示例是中午有效的转换。当使用晚上作为一天的开始时,请咨询javadoc如何做到这一点。

2016-09-07更新:

其他可能在Android上使用截然不同API的umalqura解决方案包括

  • Android开发者预览版24(谷歌似乎开始加入ICU4J)
  • msarhan的日历改编(感谢OP的评论,该库支持阿拉伯语和英语两种语言的月名)
 类似资料:
  • 周日->明谷-0 周一->赛宁-1 周二->Selasa-2 帮我谢谢

  • 问题内容: 我正在使用需要json日期格式的API。 我需要转换我的JavaScript日期 1970年1月17日星期六格林尼治标准时间+0100(浪漫标准时间) 以json日期格式 /日期(1405699200)/ 问题答案: 列各项可以吗?

  • 问题内容: 我有一个输出数据数组的PHP脚本。然后将其转换为使用函数。 我的问题是我的数组中有一个日期,但日期格式不正确。 我怎样才能在PHP中转换它呢? 代替上面的日期,我需要等效的JavaScript函数 新的Date() 当我输出上述内容时,我得到以下内容:“ Fri Jun 01 2012 11:08:48 GMT + 0100(GMT Daylight Time)”但是,如果我将PHP日

  • 问题内容: 我的json 响应 包含一个 CreatedOn 日期: 我需要将 CreatedOn 转换为简单的日期格式,并 计算从CreatedOn日期到当前日期的差异天数。 当我调试下面的代码字符串 CreatedOn时 显示一个空值。怎么会? 问题答案: 要么 考虑使用JSON方法而不是包含。JSON具有“ has()”,用于验证密钥是否存在。 您还应该确保首先尝试{}捕获{}字符串,以确保

  • 问题内容: 是否有一个内置的转换方法为在Python,例如获得在指定日期的午夜?相反的转换很容易:有一个方法。 我真的必须手动打电话吗? 问题答案: 您可以使用;现在,您创建一个初始化为午夜的对象。