验证Java 6上的Hijri日期(伊斯兰日历)

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 6中验证.我不能在Java 8中使用.
  • 我必须验证伊斯兰历法.用Hijri日期验证.我的日期已经是Hijri格式.我必须验证日期是否与伊斯兰日历有效.
  • 在伊斯兰历法中,30/02/1403是第2个月的有效日期.

Ole*_*.V. 6

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());
    }
Run Code Online (Sandbox Code Playgroud)

此代码段的输出是:

有效日期:Hijrah-umalqura AH 1403-02-30

格式模式字母区分大小写.您需要小写yyyy的日历年(或uuuu预示年份).

Java 6?三种选择.

我想在Java 6中验证.我不能在Java 8中使用.

现在已经过时了(Java 11已经出局).我的建议是:

  1. 使用ThreeTen Backport,java.time的后端到Java 6和7.事实证明它不能完全适用于你的情况,但你可以.
  2. 从一开始就问你Joda-Time.
  3. 使用Time4J.

前两个选项将拒绝您在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());
    }
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

我向你推荐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日).

链接