验证Java 6上的Hijri日期(伊斯兰日历)
我想验证Hijri日期.在我的申请中,Hijri日期将以dd / MM / YYYY的格式出现.我想在Joda Time API中验证日期是否有效.
例如,我有日期: String date = "30/02/1403"; String Pattern = "dd/MM/YYYY"; 你能帮我验证Hijri约会吗? 我的限制是: >我想在Java 6中验证.我不能在Java 8中使用. 解决方法
java.time
java.time,现代Java日期和时间API,可以这样做: DateTimeFormatter hijrahFormatter = DateTimeFormatter.ofPattern("dd/MM/yyyy") .withChronology(HijrahChronology.INSTANCE); try { HijrahDate date = hijrahFormatter.parse("30/02/1403",HijrahDate::from); System.out.println("A valid date: " + date); } catch (DateTimeParseException dtpe) { System.out.println("Not a valid date: " + dtpe.getMessage()); } 此代码段的输出是:
格式模式字母区分大小写.你需要小写yyyy为日历年(或uuuu为preleptic年). Java 6?三种选择.
现在已经过时了(Java 11已经出局).我的建议是: >使用ThreeTen Backport,java.time的后端到Java 6和7.事实证明它不适用于你的情况,但你可以. 前两个选项将拒绝您在30/02/1403的日期,但相信在1403的第二个月只有29天. ThreeTen Backport DateTimeFormatter hijrahFormatter = DateTimeFormatter.ofPattern("dd/MM/uuuu") .withChronology(HijrahChronology.INSTANCE); String dateString = "30/02/1403"; try { TemporalAccessor parsed = hijrahFormatter.parse(dateString); HijrahDate date = HijrahChronology.INSTANCE.date(parsed.get(ChronoField.YEAR),parsed.get(ChronoField.MONTH_OF_YEAR),parsed.get(ChronoField.DAY_OF_MONTH)); if (date.format(hijrahFormatter).equals(dateString)) { System.out.println("A valid date: " + date); } else { System.out.println("Not a valid date: " + dateString); } } catch (DateTimeParseException dtpe) { System.out.println("Not a valid date: " + dtpe.getMessage()); } 输出:
根据我的理解,构建日期的以下更简单的方法应该起作用,但不是: HijrahDate date = HijrahDate.from(parsed); 我得到org.threeten.bp.DateTimeException:找不到字段:EpochDay.我构建日期的方式是宽松的,也就是说,它接受月份的日期超出范围并产生Hijrah-umalqura AH 1403-03-01的日期.因此,为了完成验证,我将日期格式化,并要求我再次获取原始字符串. 如果不是30/02/1403我尝试29/02/1403,我得到
乔达时间 DateTimeFormatter islamicFormatter = DateTimeFormat.forPattern("dd/MM/yyyy") .withChronology(IslamicChronology.getInstance()); try { LocalDate date = LocalDate.parse("30/02/1403",islamicFormatter); System.out.println("A valid date: " + date); } catch (IllegalArgumentException iae) { System.out.println("Not a valid date: " + iae.getMessage()); } Joda-Time也认为这个月有29天,非常明确地说:
我得到了一条29/02/1403的字符串:
Joda-Time的伊斯兰年表带有四种不同的闰年模式.我试过这四个.它们在1403的第二个月都会产生29天.对不起,我尽可能接近. 来自Joda-Time主页:
Time4J 我向你推荐Time4J的作者Meno Hochschild的知识渊博的答案.在我看来,Time4J版本3.50根据您的要求和Java 6解决了您的问题. 但那个日期是否有效?
你比我更专业.我似乎明白Hijri日历的变体存在.根据您的变体30/02/1403是一个完全有效的日期. alhabib伊斯兰网络服务提供的版本与您同意:Safar 30,1403与公历1982年12月16日同日.另一方面,根据searchtruth.com,Safar 1403当月只有29天(Safar 29,1403对应于1982年12月15日格里高利,其次是Rabi Al-Awwal 1,1403对应于12月16日). 链接 > Oracle tutorial: Date Time解释如何使用java.time. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |