您可以将否定运算符 (!) 与 .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");
}
}
}
输出:
After
Now or after
java.util 的日期时间 API 及其格式化 API SimpleDateFormat 已过时且容易出错。建议完全停止使用它们并切换到modern date-time API。由于java.sql.Timestamp 扩展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");
}
}
}
输出:
After
Now or after
重要提示:
这两个时间戳可以相差几分之一秒(即可以在之前或之后)。然而,对于大多数实际情况,这不是我们想要的,例如业务需求可以规定,如果过去的日期时间小于当前日期时间的 5 分钟,则应该以这种方式或那种方式进行处理。现代日期时间 API 使得添加/减去时间单位变得非常容易,例如你可以这样做:
if (!zdtNow.isAfter(zdtPast.minusMinutes(5))) {
//...
} else {
//...
}
从 Trail: Date Time 了解有关现代日期时间 API 的更多信息。