java - 为什么为了比较回历与 iso 日期,您需要将 DateTime 包装在 LocalDateTime 中? (乔达)

标签 java datetime calendar jodatime gregorian-calendar

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

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

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

无论回历日期是什么,它总是返回“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 = new LocalDateTime(new DateTime("2015-03-12T10:04:43", iso), hijri);

DateTime 实例包装在 LocalDateTime 内。

为什么会发生这种情况?为什么第一个 block 不起作用?

最佳答案

这不是你想要的:

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

这不是在任何地方使用回历:

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

我怀疑你想要:

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

关于java - 为什么为了比较回历与 iso 日期,您需要将 DateTime 包装在 LocalDateTime 中? (乔达),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29009047/

相关文章:

java - 我想为桌面应用程序进行 HTTP 调用(可以从命令行调用)

java - 你怎么能像 Jackson 的 @JsonAnySetter 一样得到 Gson 中无法识别的 JSON 字段列表?

java - java如何解释unix时间戳?

linux - SQLite 中的负日期

c# - 在 DateTime 对象中存储短日期

mysql - MySQL中的日期字段,查找所有不重叠的行并仅返回差异

ios - `weekday` 是否保证在范围 [1 :7]?

python - 无法终止使用 Python 子进程启动的 Jar 文件

c# - 有时间吗?

android - 创建类似 "1-day" View 的谷歌日历应用程序布局