亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

比較不同格式的兩個日期

比較不同格式的兩個日期

慕無忌1623718 2022-11-30 13:33:27
如何比較這兩個不同格式的日期以檢查它們是否相等Date d1 = bean.fooDate; // >> from a post requestSystem.out.println(d1); // >> "Sat May 25 10:00:00 WET 2019"Date d2 = fooEntity.getFooDate(); // >> from mysql databaseSystem.out.println(d2); // >> "2019-05-25"PS 我只想將它作為日期而不是日期時間進行比較(不需要比較分鐘和秒)
查看完整描述

2 回答

?
搖曳的薔薇

TA貢獻1793條經驗 獲得超6個贊

說你的兩個日期有不同的格式是不準確的。ADate沒有格式。您所看到的打印日期是它們toString方法的返回值。


相反,您的日期有不同的運行時類型。d1是的一個實例,java.util.Date它的toString方法產生了格式Sat May 25 10:00:00 WET 2019。d2又是 的一個實例java.sql.Date。它是 的子類java.util.Date,因此可以分配給這種類型的變量。java.sql.Date.toString()產生格式2019-05-25。但是,子類(繼承)關系是一種 hack,您不應在代碼中依賴它。


不過,繼承 hack 只是這兩個類的眾多設計問題之一。幸運的是,兩者都有更新更現代的替代品。對于java.util.Datemodern Instantclass是最直接對應的類型,但具體使用哪一種取決于你更精確的要求。為了java.sql.Date更簡單,使用LocalDate. Instant和都是LocalDate現代 Java 日期和時間 API java.time 的一部分。


所以看看你是否可以用java.time 中bean.fooDate的一個或其他合適的現代類型替換。Instant同樣看看你是否可以fooEntity.getFooDate()返回一個LocalDate. Hibernate 應該很樂意為您處理LocalDate而不是Date為您處理(除非您的 Hibernate 版本很舊)。


無論如何,Srinivasan Sekar 是正確的,您應該將您從每個獲得的任何類型轉換LocalDate為只比較日期而不是小時、分鐘和秒。LocalDate正是這樣:一個沒有時間的日期。


假設您Instant從bean.fooDate. 那么轉換是:


    LocalDate localDate1 = bean.fooDate.atZone(ZoneId.of("Africa/El_Aaiun")).toLocalDate();

請務必指定適當的時區。


如果您無法避免使用老式的Date,則 Srinivasan Sekar 的回答中的轉換是正確的:


    LocalDate localDate1 = bean.fooDate

            .toInstant()

            .atZone(ZoneId.of("Africa/El_Aaiun"))

            .toLocalDate();

對于 的情況fooEntity.getFooDate(),如果你能得到LocalDate前面提到的 a,你就完成了。如果只能得到 a Date,首先檢查該方法是否被聲明為返回 ajava.util.Date或 a java.sql.Date。這可能取決于聲明方法的文件中使用的導入。a 的情況java.sql.Date很簡單(但不幸的是不能保證總是給出正確的日期):


    LocalDate localDate2 = fooEntity.getFooDate().toLocalDate();

如果聲明的返回類型是java.util.Date,您可以在上面添加一個強制轉換,因為看起來實際返回的對象是一個java.sql.Date. 不過,首先測試您的假設會更安全:


    LocalDate localDate2;

    Date d2 = fooEntity.getFooDate();

    if (d2 instanceof java.sql.Date) {

        localDate2 = ((java.sql.Date) fooEntity.getFooDate()).toLocalDate();

    } else {

        localDate2 = d2.toInstant()

                .atZone(ZoneId.of("Africa/El_Aaiun"))

                .toLocalDate();

    }

您會認識到,在第二種情況下,我使用的是與上述相同的轉換。


要比較結果LocalDate變量:


    if (localDate1.isEqual(localDate2)) {

        System.out.println("Same date");

    } else {

        System.out.println("Different dates");

    }

LocalDate也有方法isBefore,isAfter以防您需要確定哪個更早。

鏈接: Oracle 教程:解釋如何使用 java.time 的日期時間。



查看完整回答
反對 回復 2022-11-30
?
湖上湖

TA貢獻2003條經驗 獲得超2個贊

Date對象有一個getTime()返回自 1970 年 1 月 1 日以來的毫秒數的方法(請參閱文檔)。

因此,要比較兩個日期:


if (d1.getTime() == d2.getTime()) {

    // the dates represent the same point in time

} else {

    // they are different points in time

}

您還可以使用此技術來查看一個是在另一個之前還是之后使用<or >。


編輯:如果您想比較日期而不考慮時間部分,只需將返回的每個值除以getTime()一天中的毫秒數(1000 * 60 * 60 * 24):


long millisInADay = 1000 * 60 * 60 * 24;

long m1 = d1.getTime() / millisInADay;

long m2 = d2.getTime() / millisInADay;


if (m1 == m2) {

    // the two dates (excluding time) are the same

} else {

    // they're not

}


查看完整回答
反對 回復 2022-11-30
  • 2 回答
  • 0 關注
  • 142 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號