加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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

发布时间:2020-12-15 08:28:01 所属栏目:Java 来源:网络整理
导读:我想验证Hijri日期.在我的申请中,Hijri日期将以dd / MM / YYYY的格式出现.我想在Joda Time API中验证日期是否有效. 例如,我有日期: String date = "30/02/1403";String Pattern = "dd/MM/YYYY"; 你能帮我验证Hijri约会吗? 我的限制是: 我想在Java 6中验证
我想验证Hijri日期.在我的申请中,Hijri日期将以dd / MM / YYYY的格式出现.我想在Joda Time API中验证日期是否有效.

例如,我有日期:

String date = "30/02/1403";
String Pattern = "dd/MM/YYYY";

你能帮我验证Hijri约会吗?

我的限制是:

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

解决方法

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());
    }

此代码段的输出是:

A valid date: Hijrah-umalqura AH 1403-02-30

格式模式字母区分大小写.你需要小写yyyy为日历年(或uuuu为preleptic年).

Java 6?三种选择.

I want to validate in Java 6. I can’t use in Java 8.

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

>使用ThreeTen Backport,java.time的后端到Java 6和7.事实证明它不适用于你的情况,但你可以.
>从一开始就问你使用Joda-Time.
>使用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());
    }

输出:

Not a valid date: 30/02/1403

根据我的理解,构建日期的以下更简单的方法应该起作用,但不是:

HijrahDate date = HijrahDate.from(parsed);

我得到org.threeten.bp.DateTimeException:找不到字段:EpochDay.我构建日期的方式是宽松的,也就是说,它接受月份的日期超出范围并产生Hijrah-umalqura AH 1403-03-01的日期.因此,为了完成验证,我将日期格式化,并要求我再次获取原始字符串.

如果不是30/02/1403我尝试29/02/1403,我得到

A valid date: 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天,非常明确地说:

Not a valid date: Cannot parse “30/02/1403”: Value 30 for dayOfMonth
must be in the range [1,29]

我得到了一条29/02/1403的字符串:

A valid date: 1403-02-29

Joda-Time的伊斯兰年表带有四种不同的闰年模式.我试过这四个.它们在1403的第二个月都会产生29天.对不起,我尽可能接近.

来自Joda-Time主页:

Note that Joda-Time is considered to be a largely “finished” project.
No major enhancements are planned. If using Java SE 8,please migrate
to java.time (JSR-310).

Time4J

我向你推荐Time4J的作者Meno Hochschild的知识渊博的答案.在我看来,Time4J版本3.50根据您的要求和Java 6解决了您的问题.

但那个日期是否有效?

But If you will check the Islamic calendar it is a valid date of 2nd month.

你比我更专业.我似乎明白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.
> Java Specification Request (JSR) 310,其中首次描述了java.time.
> ThreeTen Backport project,java.time的后端到Java 6和7(用于JSR-310的ThreeTen).
> ThreeTenABP,ThreeTen Backport的Android版
> Joda-Time homepage
> Time4J – Advanced Date,Time,Zone and Interval Library for Java
> Answer by Meno Hochschild(仅为了完整性)
> Islamic (Hijri) Calendar Year 1982 CE Based on Global Crescent Moon Sighting Probability on alhabib islamic web services
> Hijri Islamic Calendar November 1982 – 1403 ??????? ?????? ????????? on searchtruth.com

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读