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());
}
此代码段的输出是:
有效日期:Hijrah-umalqura AH 1403-02-30
格式模式字母区分大小写。您需要小写yyyy
日历年(或uuuu
预测年)。
爪哇6?三个选项。
我想在 Java 6 中验证。我不能在 Java 8 中使用。
现在已经过时了(Java 11 已经发布)。我的建议是:
- 使用 ThreeTen Backport,它是 java.time 到 Java 6 和 7 的反向移植。事实证明,它并不适合您的情况,但您可以。
- 正如您从一开始就询问的那样,使用 Joda-Time。
- 使用 Time4J。
不过,前两个选项将拒绝您的日期 30/02/1403,但相信 1403 年的第二个月只有 29 天。
ThreeTen 后端口
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());
}
输出:
无效日期:30/02/1403
根据我的理解,以下构造日期的更简单方法应该可以工作,但不能:
HijrahDate date = HijrahDate.from(parsed);
我明白了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());
}
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)。
时间4J
我建议您参考 Time4J 的作者 Meno Hochschild 的知识渊博的回答。在我看来,Time4J 3.50 版根据您的要求和 Java 6 解决了您的问题。
但是那个日期是否有效?
但是,如果您检查伊斯兰日历,则它是第 2 个月的有效日期。
你比我更专业。我似乎理解回历的变体存在。根据您的变体 30/02/1403 是一个完全有效的日期。alhabib Islam web services 提供的版本与您的一致:Safar 30, 1403 与公历 1982 年 12 月 16 日是同一天。另一方面,根据 searchtruth.com,Safar 1403 月份只有 29 天(Safar 29, 1403 对应于公历 1982 年 12 月 15 日,随后是 Rabi Al-Awwal 1, 1403 对应于 12 月 16 日)。
链接