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 的日期時間。

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
}
添加回答
舉報