簡體   English   中英

比較不同格式的兩個日期

[英]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方法的返回值。

而是你的日期有不同的運行時類型 d1java.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 InstantLocalDate都是java.time的一部分,java.time是現代Java日期和時間API。

因此,請查看是否可以使用bean.fooDateInstant或其他適當的現代類型替換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.Datejava.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還有方法isBeforeisAfter ,以防你需要確定哪個更早。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM