比较java.sql.timestamp值
对于比较java.sql.timestamp值,java,scala,apache-spark,apache-spark-sql,timestamp,Java,Scala,Apache Spark,Apache Spark Sql,Timestamp,对于Timestamp值,如何比较=,因为我们可以使用现有的 myTs.before(someTs) 但这会在内部检查,如果它不检查相等性,则可以使用not of after。因此: !myTs.after(someTs) 或者,您可以获取时间戳的时间并进行比较 myTs.getTime() >= someTs.getTime() Timestamp类的方法返回: 如果此时间戳对象等于给定的时间戳,则整数值为0 如果此时间戳对象在 给定论点 ts1.compareTo(ts2)
Timestamp
值,如何比较=,因为我们可以使用现有的
myTs.before(someTs)
但这会在内部检查
,如果它不检查相等性,则可以使用not of after。因此:
!myTs.after(someTs)
或者,您可以获取时间戳的时间并进行比较
myTs.getTime() >= someTs.getTime()
Timestamp类的方法返回:
- 如果此时间戳对象等于给定的时间戳,则整数值为0
- 如果此时间戳对象在
给定论点
ts1.compareTo(ts2) >= 0
- 如果此时间戳对象为空,则值大于0
在给定的论点之后
ts1.compareTo(ts2) >= 0
您可以将求反运算符(!
)与.before
和.before
一起使用,如下所示:
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");
}
}
}
java.util
的日期时间API及其格式化APISimpleDataFormat
已经过时,并且容易出错。建议完全停止使用它们,并切换到。由于java.sql.Timestamp
扩展了java.util.Date
,因此它会继承相同的问题。无论出于何种原因,如果您必须坚持使用Java6或Java7,您可以使用哪个backport将大部分Java.time功能移植到Java6&7
您可以使用切换到现代日期时间API。一旦您拥有了Instant
,您就可以将其转换为其他java.time
类型
演示:
After
Now or after
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 {
//...
}
从了解有关现代日期时间API的更多信息getTime()是否返回seconds@supernatural,你说得不对。getTime方法返回,自1970年1月1日00:00:00 GMT以来的毫秒数。您可以检查tihs metod的javadoc。好的,只需运行msTs.getTime()/1000,我们就可以在秒数内得到结果,没错@Superfurali建议您不要使用时间戳
。那门课设计得很糟糕,而且早已过时。而是使用来自的Instant
from。有一纳秒-十亿分之一秒-其中