Java 为什么为了比较hijri和iso日期,您需要在LocalDateTime中包装一个DateTime?(乔达)

Java 为什么为了比较hijri和iso日期,您需要在LocalDateTime中包装一个DateTime?(乔达),java,datetime,calendar,jodatime,gregorian-calendar,Java,Datetime,Calendar,Jodatime,Gregorian Calendar,我正在尝试将ISO(公历)日期转换为hijri(伊斯兰教)日期,并将第一个日期与hijri日期进行比较 我所做的和不起作用的是: Chronology iso = ISOChronology.getInstanceUTC(); Chronology hijri = IslamicChronology.getInstanceUTC(); DateTime dtISO = new DateTime("2015-03-12T10:04:43", iso); Syst

我正在尝试将ISO(公历)日期转换为hijri(伊斯兰教)日期,并将第一个日期与hijri日期进行比较

我所做的和不起作用的是:

    Chronology iso = ISOChronology.getInstanceUTC();
    Chronology hijri = IslamicChronology.getInstanceUTC();

    DateTime dtISO = new DateTime("2015-03-12T10:04:43", iso);

    System.out.println("dtISO: " + dtISO);
    DateTime toHijri = new DateTime(dtISO, hijri);
    System.out.println("toHijri: " + toHijri); // 1436-05-21T10:04:43.000Z
    DateTimeFormatter formatter = DateTimeFormat.forPattern("YYYY-MM-dd HH-mm");

    DateTime hijriDt = new DateTime(formatter.parseDateTime("1442-05-21 10-10"), iso);

    if (hijriDt.isAfter(toHijri)) {
        System.out.println("hijriDt date is after toHijri date");
    }
    if (hijriDt.isBefore(toHijri)) {
        System.out.println("hijriDt date is before toHijri date");
    }
    if (hijriDt.isEqual(toHijri)) {
        System.out.println("hijriDt date is equal toHijri date");
    }
无论hijri日期是什么,它总是返回“hijriDt日期早于toHijri日期”

现在,当我进行实验时,我尝试了以下方法:

    Chronology iso = ISOChronology.getInstanceUTC();
    Chronology hijri = IslamicChronology.getInstanceUTC();

    LocalDateTime toHijri = new LocalDateTime(new DateTime("2015-03-12T10:04:43", iso), hijri);
    System.out.println("toHijri: " + toHijri); // 1436-05-21T10:04:43.000Z
    DateTimeFormatter formatter = DateTimeFormat.forPattern("YYYY-MM-dd HH-mm");

    LocalDateTime hijriDt = new LocalDateTime(formatter.parseDateTime("1442-05-21 10-10"), iso);

    if (hijriDt.isAfter(toHijri)) {
        System.out.println("hijriDt date is after toHijri date");
    }
    if (hijriDt.isBefore(toHijri)) {
        System.out.println("hijriDt date is before toHijri date");
    }
    if (hijriDt.isEqual(toHijri)) {
        System.out.println("hijriDt date is equal toHijri date");
    }
这就像一个符咒。请注意toHijri日期是如何构造的: LocalDateTime toHijri=新的LocalDateTime(新的日期时间(“2015-03-12T10:04:43”,iso),hijri)

DateTime实例包装在LocalDateTime中


为什么会这样?为什么第一个块不工作?

这不是您想要的:

DateTime hijriDt = new DateTime(formatter.parseDateTime("1442-05-21 10-10"), iso);
DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd HH-mm")
    .withChronology(hijri);
DateTime hijriDt = formatter.parseDateTime("1442-05-21 10-10");
没有在任何地方使用Hijri日历:

  • 格式化程序正在使用ISO(默认情况下)
  • 您正在解析1442 ISO年的日期,这不是您想要的
  • 然后将其“转换”为ISO日历(它已经存在)
  • 您的变量名表明您希望它出现在Hijri日历中,但事实并非如此
我怀疑你想要:

DateTime hijriDt = new DateTime(formatter.parseDateTime("1442-05-21 10-10"), iso);
DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd HH-mm")
    .withChronology(hijri);
DateTime hijriDt = formatter.parseDateTime("1442-05-21 10-10");

谢谢你的及时答复。你知道为什么第二个街区能用吗?虽然“LocalDateTime toHijri”已经转换成hijri,但它是否被视为iso?@ampofila:我怀疑它没有真正起作用——它只是给了你你期望的比较答案。我现在没有时间去检查原因,但肯定不是Hijri的约会…找到了。比较LocalDateTime实例的方式不同于DateTime实例。第一个简单地按顺序比较每个字段,从最大到最小(从文档中),而第二个比较毫秒。@ampofila:Eek,不检查时间顺序?这太可怕了,让我吃惊。请检查中的比较方法。在我看来,它只检查整数。就DateTime而言()我看不到时间顺序参与比较,但我认为他们使用时间顺序来创建实例。