【问题标题】:Comparing java.sql.timestamp values比较 java.sql.timestamp 值
【发布时间】:2021-05-03 04:38:06
【问题描述】:

对于Timestamp的值,如何比较=,因为我们可以使用现有的

myTs.before(someTs)

但这在内部检查 < 而不是 <=
我基本上需要检查 myTs <= someTs1 and myTs>=someTs1

我们如何比较 = 以及如何从时间戳中获取纪元秒数?

【问题讨论】:

  • 我建议你不要使用Timestamp。该课程设计不良且早已过时。而是使用来自java.time, the modern Java date and time API 的Instant。
  • 有一纳秒——十亿分之一秒——< 和<= 会给出不同的结果。你为什么需要如此极端的精度?

标签: java scala apache-spark apache-spark-sql timestamp


【解决方案1】:

Timestamp 类的compareTo() 方法返回:

  • 如果此 Timestamp 对象等于给定的 Timestamp,则为整数值 0

  • 如果此 Timestamp 对象在 给定论点

  • 如果此 Timestamp 对象是大于 0 的值 在给定参数之后

    ts1.compareTo(ts2) >= 0 
    

【讨论】:

    【解决方案2】:

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

    !myTs.after(someTs)
    

    或者,您可以获取时间戳的时间并进行比较。

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

    【讨论】:

    • 是 getTime() 返回的秒数
    • @supernatural ,你错了。 getTime 方法返回自 1970 年 1 月 1 日 00:00:00 GMT 以来的毫秒数。你可以查看tihs方法的javadoc。
    • 好的,所以只需执行 msTs.getTime()/1000 即可在几秒钟内完成
    【解决方案3】:

    您可以将否定运算符 (!) 与 .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 的更多信息。

    【讨论】:

      猜你喜欢
      • 2017-10-08
      • 1970-01-01
      • 1970-01-01
      • 2012-11-30
      • 2019-11-08
      • 1970-01-01
      • 2015-09-02
      • 2016-01-14
      • 2011-05-11
      相关资源
      最近更新 更多