[英]Comparing two dates from different format
如何比較不同格式的這兩個日期,以檢查它們是否相等
Date d1 = bean.fooDate; // >> from a post request
System.out.println(d1); // >> "Sat May 25 10:00:00 WET 2019"
Date d2 = fooEntity.getFooDate(); // >> from mysql database
System.out.println(d2); // >> "2019-05-25"
PS我想把它比作日期而不是日期時間(不需要比較分鍾和secondes)
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
}
您也可以使用此技術使用<
或>
查看一個是在另一個之前還是之后。
編輯 :如果要比較日期而不考慮時間組件,只需將getTime()
返回的每個值除以一天中的millis數(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
}
從java 8時間使用toLocalDate()
來比較日期部分
LocalDate localDate1=date1.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
LocalDate localDate2=date2.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
localDate1.compareTo(localDate2)
說你的兩個日期格式不同並不准確。 Date
沒有格式。 您看到打印日期的內容是其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.Date
,現代Instant
類是最直接對應的類型,但確切使用哪一類取決於您更精確的要求。 對於java.sql.Date
它更簡單,使用LocalDate
。 Instant
和LocalDate
都是java.time的一部分,java.time是現代Java日期和時間API。
因此,請查看是否可以使用bean.fooDate
的Instant
或其他適當的現代類型替換bean.fooDate。 同樣,看看你是否可以讓fooEntity.getFooDate()
返回一個LocalDate
。 Hibernate應該樂意為你處理LocalDate
而不是Date
(除非你的Hibernate版本很舊)。
在任何情況下,Srinivasan Sekar都是正確的,你應該將你從每個類型轉換為LocalDate
只比較日期而不是小時,分鍾和秒。 LocalDate
恰恰是:沒有時間的日期。
假設您從bean.fooDate
獲得了一個Instant
。 然后轉換是:
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
,那么您就完成了。 如果只能獲得Date
,請首先檢查該方法是否聲明為返回java.util.Date
或java.sql.Date
。 它可能取決於聲明方法的文件中使用的導入。 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。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.