【问题标题】:Java SQL subtract an hour from dateJava SQL 从日期中减去一个小时
【发布时间】:2012-08-03 18:25:08
【问题描述】:

我需要一个与一小时前对应的java.sql.Timestamp 值。我在这里发生了一些与日期相关的事情,因此重要的是当前时间只采样一次,其余代码使用同一时间。至于根据当前时间以毫秒为单位设置Timestamp

操作Calendar 对象似乎很笨拙,因为我必须做一些事情,比如在日历中添加和减去时间,这会修改它,所以我会很高兴先克隆自己一个副本或切换它的值周围。

【问题讨论】:

  • 你为什么用 SQL 标记这个?您想要 Java 的解决方案还是使用 SQL 的解决方案?

标签: java sql date timestamp


【解决方案1】:

制作时间戳时只需从当前时间减去一个小时(以毫秒为单位)(1 小时 = 60 * 60 * 1000 毫秒)

Timestamp oneHourAgo = new Timestamp(System.currentTimeMillis() - (60 * 60 * 1000));

【讨论】:

    【解决方案2】:

    tl;博士

    mySqlTimestamp.toInstant()
                  .minus( Duration.ofHours( 1 ) )
    

    避免使用旧的日期时间类

    java.sql 类型仅用于与数据库交换数据。不要将这些用于业务逻辑。

    麻烦的旧日期时间类现在被 java.time 类所取代。 java.sql.Timestamp 的 java.time 等效项是 java.time.Instant。您甚至可以通过添加到旧类的新方法进行转换。

    Instant instant = mySqlTimestamp.toInstant();
    

    然后您可以减去一个由Duration 表示的小时。

    Duration d = Duration.ofHours( 1 );
    Instant hourPrior = instant.minus( d );
    

    请注意,这些类遵循Immutable Objects 模式。不是修改(“变异”)对象中的部分值,而是基于原始值实例化一个新对象。所以在另一个答案中讨论的side-effects 没有问题。并自动thread-safe

    【讨论】:

    • 刚刚遇到这个答案。我唯一关心/问题是什么是 mySqlTimeStamp?
    • @MarkII mySqlTimestamp 是您在上一段中提到的java.sql.Timestamp 实例名称的虚构占位符。小写的m 是一个约定,告诉你它是一个实例而不是一个类,my… 是在简单示例代码中命名变量的常用约定。
    【解决方案3】:

    你可以使用这样的函数:

    Timestamp subtractOneHour(Timestamp stamp)
    {
        long current = stamp.getTime();
        long substracted = current - 60 * 60 * 1000;
        return new Timestamp(substracted);
    }
    

    【讨论】:

    • 有点危险,因为方法签名暗示它没有副作用。我建议在任何情况下都克隆时间戳,并且实际上可能会拼出“减法”。
    【解决方案4】:

    看看这个帖子:Java Timestamp - How can I create a Timestamp with the date 23/09/2007?

    重要的是当前时间只采样一次,并且 其余代码使用相同的时间。

    我建议将时间分配给一个变量,然后重新使用同一个变量..

    【讨论】:

      【解决方案5】:

      除了摆弄Calendar 对象之外,您还有一些选择 -

      1. 使用Apache Date Utilities,它基本上会为您处理Calendar(如果需要),但会返回一个新的Date 对象(因此,线程安全)。
      2. 使用Joda Time 处理日期/时间,这通常被认为是一个整体上更好的库。

      【讨论】:

        猜你喜欢
        • 2015-05-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-07-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-11
        相关资源
        最近更新 更多