Ram*_*har 4 java validation jodatime java-6 hijri
我想验证Hijri日期.在我的应用程序中,Hijri日期将以格式化dd/MM/YYYY.我想在Joda Time API中验证日期是否有效.
例如,我有日期:
String date = "30/02/1403";
String Pattern = "dd/MM/YYYY";
Run Code Online (Sandbox Code Playgroud)
你能帮我验证Hijri约会吗?
我的限制是:
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());
}
Run Code Online (Sandbox Code Playgroud)
此代码段的输出是:
有效日期:Hijrah-umalqura AH 1403-02-30
格式模式字母区分大小写.您需要小写yyyy的日历年(或uuuu预示年份).
我想在Java 6中验证.我不能在Java 8中使用.
现在已经过时了(Java 11已经出局).我的建议是:
前两个选项将拒绝您在30/02/1403的日期,但相信在1403的第二个月只有29天.
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());
}
Run Code Online (Sandbox Code Playgroud)
输出:
不是有效日期:30/02/1403
根据我的理解,构建日期的以下更简单的方法应该起作用,但不是:
HijrahDate date = HijrahDate.from(parsed);
Run Code Online (Sandbox Code Playgroud)
我得到org.threeten.bp.DateTimeException: Field not found: EpochDay.我构造日期的方式是宽松的,也就是说,它接受月份的日期超出范围并产生日期Hijrah-umalqura AH 1403-03-01.因此,为了完成验证,我将日期格式化,并要求我再次获取原始字符串.
如果不是30/02/1403我尝试29/02/1403,我得到
有效日期:Hijrah-umalqura AH 1403-02-29
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());
}
Run Code Online (Sandbox Code Playgroud)
Joda-Time也认为这个月有29天,非常明确地说:
不是有效日期:无法解析"30/02/1403":dayOfMonth的值30必须在[1,29]范围内
29/02/1403我得到了一串:
有效日期:1403-02-29
Joda-Time的伊斯兰年表带有四种不同的闰年模式.我试过这四个.它们在1403的第二个月都会产生29天.对不起,我尽可能接近.
来自Joda-Time主页:
请注意,Joda-Time被认为是一个很大程度上"完成"的项目.没有计划重大改进.如果使用Java SE 8,请迁移到
java.time(JSR-310).
我向你推荐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日).
java.time.java.time第一被描述.java.timeJava 6和7的后端(JST-310的ThreeTen).| 归档时间: |
|
| 查看次数: |
449 次 |
| 最近记录: |