簡體   English   中英

比較 java.sql.timestamp 值

[英]Comparing java.sql.timestamp values

對於Timestamp值,如何比較 <= 或 >=,因為我們可以使用現有的

myTs.before(someTs)

但這在內部檢查<<=
我需要基本上檢查myTs <= someTs1 and myTs>=someTs1

我們如何比較 <= 或 >= 以及我們如何從時間戳中獲取紀元秒數?

Timestamp class 的compareTo()方法返回:

  • Integer 值 0 如果此時間戳 object 等於給定時間戳

  • 如果此時間戳 object 在給定參數之前,則值小於 0

  • 如果此時間戳 object 在給定參數之后,則值大於 0

     ts1.compareTo(ts2) >= 0

如果它不檢查相等性,則可以使用 not of after。 所以:

!myTs.after(someTs)

或者,您可以獲得時間戳的時間並進行比較。

myTs.getTime() >= someTs.getTime()

您可以將否定運算符 ( ! ) 與.before.after一起使用,如下所示:

import java.sql.Timestamp;
import java.util.Calendar;
import java.util.Date;

public class Main {
    public static void main(String[] args) {
        Calendar calendar = Calendar.getInstance();
        calendar.set(2021, 0, 10);// 10-Jan-2021
        Date datePast = calendar.getTime();
        Timestamp tsPast = new Timestamp(datePast.getTime());

        Date dateNow = new Date();
        Timestamp tsNow = new Timestamp(dateNow.getTime());

        // Check <=
        if (!tsNow.after(tsPast)) {
            System.out.println("Now or before");
        } else {
            System.out.println("After");
        }

        // Check >=
        if (!tsNow.before(tsPast)) {
            System.out.println("Now or after");
        } else {
            System.out.println("Before");
        }
    }
}

Output:

After
Now or after

java.util 的日期時間java.util及其格式 API, SimpleDateFormat已過時且容易出錯。 建議完全停止使用它們並切換到現代日期時間 APIjava.sql.Timestamp extends java.util.Date ,它繼承了同樣的問題。 出於任何原因,如果您必須堅持使用 Java 6 或 Java 7,您可以使用ThreeTen-Backport ,它將大部分java.time功能反向移植到 Java 6 和 7。

您可以使用Timestamp#toInstant()切換到現代日期時間 API。擁有Instant后,您可以將其轉換為其他java.time類型。

演示:

import java.sql.Timestamp;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.util.Calendar;
import java.util.Date;

public class Main {
    public static void main(String[] args) {
        Calendar calendar = Calendar.getInstance();
        calendar.set(2021, 0, 10);// 10-Jan-2021
        Date datePast = calendar.getTime();
        Timestamp tsPast = new Timestamp(datePast.getTime());
        ZonedDateTime zdtPast = tsPast.toInstant().atZone(ZoneId.of("Europe/London"));

        Date dateNow = new Date();
        Timestamp tsNow = new Timestamp(dateNow.getTime());
        ZonedDateTime zdtNow = tsNow.toInstant().atZone(ZoneId.of("Europe/London"));

        // Check <=
        if (!zdtNow.isAfter(zdtPast.minusMinutes(5))) {
            System.out.println("Now or before");
        } else {
            System.out.println("After");
        }

        // Check >=
        if (!zdtNow.isBefore(zdtPast)) {
            System.out.println("Now or after");
        } else {
            System.out.println("Before");
        }
    }
}

Output:

After
Now or after

重要說明:

這兩個時間戳甚至可以相差幾分之一秒(即可以在之前或之后)。 然而,對於大多數實際場景,這不是我們想要的,例如業務需求可以 state 如果過去的日期時間小於當前日期時間的 5 分鍾,則應該以這種方式或那種方式進行處理。 現代日期時間 API 使得添加/減去時間單位變得非常容易,例如您可以執行以下操作:

if (!zdtNow.isAfter(zdtPast.minusMinutes(5))) {
    //...
} else {
    //...
}

Trail:Date Time了解有關現代日期時間 API 的更多信息。

暫無
暫無

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

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