我很遗憾你不明智.很多人盲目推荐像Joda-Time这样的知名图书馆,甚至没有检查这是否可以解决您的问题并符合您的要求.

哪个要求?你说过了:

value tuple (1436, “SHawwal”, 18) => gregorian date as String (“3rd

August 2015”)

让我们首先证明Joda-Time无法进行此转换. Shawwal(“شوال”)是伊斯兰农历的第十个月.所以我们可以尝试这个Joda-Time代码:

Chronology hijri =

IslamicChronology.getInstance(DateTimeZone.UTC, IslamicChronology.LEAP_YEAR_INDIAN);

LocalDate dtHijri = new LocalDate(1436, 10, 18, hijri);

Chronology iso = ISOChronology.getInstanceUTC();

LocalDate dtIso = // Joda does not offer a direct conversion, sorry

dtHijri.toDateTimeAtStartOfDay(DateTimeZone.UTC)

.withChronology(iso).toLocalDate();

System.out.println("hijri-to-gregorian: " + dtHijri + "=>" + dtIso);

// hijri-to-gregorian: 1436-10-18=>2015-08-04

Joda-Time(LEAP_YEAR_15_BASED,LEAP_YEAR_16_BASED,LEAP_YEAR_HABASH_AL_HASIB或LEAP_YEAR_INDIAN)提供的所有闰年模式都会产生相同的结果“2015-08-04”,这比您的预期晚一天.我已经明确测试了所有四种闰年模式.

Java-8是另一种选择吗?

HijrahDate hd = HijrahChronology.INSTANCE.date(HijrahEra.AH, 1436, 10, 18);

LocalDate ld = LocalDate.from(hd);

System.out.println("java-8: " + ld); // java-8: 2015-08-03

这很好,但我认为你需要在Android上完成这项工作.那里你会失败因为Java-8-classes根本不可用.

顺便说一下:为什么Java-8在这里产生正确的结果?它使用了沙特阿拉伯的Umalqura日历数据,而Joda-Time使用了四个半学术近似的伊斯兰日历.实际上,伊斯兰日历存在于许多本地变体中(我上面的评论针对这一点要求您询问您要使用哪种变体).

那么ThreetenABP会不会这么做,因为它应该是Android上的java.time(JSR-310)的后端?

HijrahDate hd = HijrahChronology.INSTANCE.date(HijrahEra.AH, 1436, 10, 18);

org.threeten.bp.LocalDate ld = org.threeten.bp.LocalDate.from(hd);

System.out.println("threeten-bp: " + ld); // threeten-bp: 2015-08-04

令人惊讶的是,后退失败了.如果您注意有关Hijri日历的ThreetenBP和Java-8的文档,那么您将看到一个很大的不同. ThreetenBP不使用Umalqura日历!它事实上相当于Joda-Time的闰年模式LEAP_YEAR_16_BASED.好吧,作为(笨拙)解决方法,您可以配置ThreetenBP,以便通过定义here中描述的配置文件来告诉偏差.但我强烈怀疑这只适用于Java平台,因为ThreetenABP(ThreetenBP的Android迁移)并不关心在给定Android应用程序的assets-directory中定义此类文件.

ICU4J怎么样?

ICU4J(Unicode的国际组件)似乎起作用,至少有三个variants:ISLAMIC,ISLAMIC_TBLA和ISLAMIC_UMALQURA.所有3种变体都产生“2015-08-03”.因此,您必须仔细决定使用哪一个,因为这些变体在其他日子会有所不同!关于TBLA变体,这是一个半学术近似,类似于Joda-Time的LEAP_YEAR_16_BASED(但使用星期四时代 – 一直有一天的差异).称为ISLAMIC的变体是月球周期的简化天文模拟.我怀疑你宁愿想要沙特阿拉伯的Umalqura日历,对吧?

无论如何,ICU4J有一个很大的缺点.它不是为Android平台设计的,非常大(10.7 MByte).据报道有些人无法在Android上运行该软件.

我的建议:使用Time4A

我在Android平台上分析当前对Hijri日历的支持的结果是开发了一个名为Time4A的替代库,以帮助人们在该平台上使用Hijri日历.该库(版本v3.6-2015f)支持8个半学术闰年模式,包括tbla-variant(HijriAlgorithm.WEST_ISLAMIC_ASTRO),沙特阿拉伯的Umalqura日历和ICU4J的天文模拟.并且重要的是:Time4A还将理解阿拉伯语月份名称(使用新的语言环境(“ar”)).例:

HijriCalendar hijri =

HijriCalendar.of(HijriCalendar.VARIANT_UMALQURA, 1436, HijriMonth.SHAWWAL, 18);

PlainDate iso = hijri.transform(PlainDate.class);

System.out.println("Time4A: " + iso); // Time4A: 2015-08-03

现在最终的代码解决方案处理您的要求中的一些奇怪的事情

int hijriYear = 1436;

String hijriMonth = "SHawwal";

int hijriDayOfMonth = 18;

ChronoFormatter inputFormat =

ChronoFormatter.setUp(HijriCalendar.class, Locale.ENGLISH)

.addPattern("yyyyMMMMd", PatternType.NON_ISO_DATE).build();

HijriCalendar hijriDate =

inputFormat

.with(Attributes.PARSE_CASE_INSENSITIVE, true)

.withCalendarVariant(HijriCalendar.VARIANT_UMALQURA)

.parse(hijriYear + hijriMonth + hijriDayOfMonth);

PlainDate iso = hijriDate.transform(PlainDate.class);

ChronoFormatter outputFormat =

ChronoFormatter.setUp(PlainDate.class, Locale.ENGLISH)

.addEnglishOrdinal(PlainDate.DAY_OF_MONTH)

.addPattern(" MMMM uuuu", PatternType.CLDR).build();

String s = outputFormat.format(iso);

System.out.println(s); // 3rd August 2015

但是你仍然需要考虑你真正想要的Hijri日历的哪个版本.没有智能软件可以为您决定.

格里高利历java_java – 从Hijri日期字符串中获取格里高利日期相关推荐

  1. python正则取字符串日期_python 正则表达式获取字符串中所有的日期和时间

    提取日期前的处理 1.处理文本数据的日期格式统一化 text = "2015年8月31日,衢州元立金属制品有限公司仓储公司(以下简称元立仓储公司)成品仓库发生一起物体打击事故,造成直接经济损 ...

  2. python获取月份字符串_python 正则表达式获取字符串中所有的日期和时间

    提取日期前的处理 1.处理文本数据的日期格式统一化 text = "2015年8月31日,衢州元立金属制品有限公司仓储公司(以下简称元立仓储公司)成品仓库发生一起物体打击事故,造成直接经济损 ...

  3. String字符串中获取所有匹配结果的索引值

    String字符串中获取所有匹配结果的索引值 例如现在我们有这样一段代码 public interface ActErrorHisMapper {public List<ActError> ...

  4. php获取本月工作日,ThinkPHP中获取指定日期后工作日的具体日期方法

    ThinkPHP中获取指定日期后工作日的具体日期方法 来源:中文源码网    浏览: 次    日期:2019年11月5日 [下载文档:  ThinkPHP中获取指定日期后工作日的具体日期方法.txt ...

  5. php获取工作日时间,ThinkPHP中获取指定日期后工作日的具体日期方法

    思路: 1.获取到查询年份内所有工作日数据数组 2.获取到查询开始日期在工作日的索引 3.计算需查询日期索引 4.获得查询日期 /*创建日期类型记录表格*/ CREATE TABLE `tb_work ...

  6. 格里高利历java_java时间类简单总结

    java时间类(Data类) 1.Data类(没有考虑到国际化,好多方法已过时java.util.Data包中) 父类(是类不是接口含有直接子类3个):  日期格式为:年月日时分秒(不包含毫秒部分) ...

  7. 格里高利历java_Java 日历笔记

    Calendar类 getFirstDayOfWeek public int getFirstDayOfWeek() 获取一星期的第一天:例如,在美国,这一天是 SUNDAY,而在法国,这一天是 MO ...

  8. mysql 获取每天的日期_mysql中获取一天、一周、一月时间数据的各种sql语句写法...

    今天抽时间整理了一篇mysql中与天.周.月有关的时间数据的sql语句的各种写法,部分是收集资料,全部手工整理,自己学习的同时,分享给大家,并首先默认创建一个表.插入2条数据,便于部分数据的测试,其中 ...

  9. Python 比较日期字符串与当前日期的日期差

    在Python中经常会需要用到时间比较的情况,如爬取特定一段时间的数据,或比较某一时间值和当前时间的差 import datetimedate_str = "2020-07-06" ...

最新文章

  1. Python进阶3——列表解析式和生成器表达式
  2. Common-lang包中StringUtils用法
  3. 在 vue 组件中查看 vuex 定义
  4. PHP程序员如何突破技术瓶颈
  5. UVa 11059 Maximum Product
  6. resultset不支持循环遍历_二叉树的各种遍历方法的简单解释
  7. windows7.0旗舰版安装后控制面板自带的Microsoft程序
  8. 编译qt的oracle驱动,怎样编译Qt下的Oracle驱动
  9. 数据科学包13-实例2:时间事件日志
  10. 稳压二极管真的可以稳压吗?
  11. 升职加薪,必不可少!Python刷题打怪,你要的LeetCode答案都在这里了!
  12. 【JAVA】每日练习——01
  13. 富文本编辑器:editor.md
  14. python package和目录_Python package和folder
  15. c51语言转换ASCII码,数据转换:C51数字转字符最快速的方法 ASCII转换
  16. ASUS华硕天选/天选2P/天选3P/飞行堡垒789/枪神/枪神2/枪神3/枪神4/枪神5P/枪神6P/幻14 FA506 FX506安装原厂Windows10系统原装Windows11出厂系统重装
  17. 超级计算机图片高清,专业不止一点,vivo X50 Pro+后置四摄,高清1亿模式亮点十足...
  18. 九头牛的故事—你就是那个美丽的期待(刘俊平咨询师)
  19. NMS by Representative Region: Towards Crowded Pedestrian Detection by Proposal Pairing
  20. JavaScript学习之路(WebAPIs阶段)

热门文章

  1. 安卓开发app版本更新
  2. [Java并发包学习八]深度剖析ConcurrentHashMap
  3. 怎么选择靠谱的Java培训机构?
  4. Linux权限“suid”与“guid”设置
  5. 【R语言】dplyr包
  6. QlExpress 性能优化(二)
  7. 通过加速计和地磁传感器实现方位角
  8. 英语影视台词---绿皮书(2)(利普 我以为你要把那家伙打死了)
  9. 数据分析师兴起并繁荣背后的原因
  10. citra黑屏_3ds模拟器最新版Citra下载_3ds模拟器Citra2019最新版下载_游戏堡