Java SQL从日期减去一小时

时间:2012-08-06 18:51:40

标签: java sql date timestamp

我需要一小时前对应的java.sql.Timestamp值。我在这里发生了一些与日期有关的事情,因此重要的是当前时间只采样一次,其余代码使用同一时间。至于基于ms的当前时间设置Timestamp

操纵Calendar对象看起来非常笨拙,因为我必须做一些事情,比如在日历中添加和减去时间,这会修改它,所以我会很高兴自己克隆自己的副本或切换它的价值。

5 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:3)

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

答案 2 :(得分:0)

查看此主题:Java Timestamp - How can I create a Timestamp with the date 23/09/2007?

  

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

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

答案 3 :(得分:0)

你可以使用像这样的函数:

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

答案 4 :(得分:0)

除了弄乱Calendar对象 -

之外,您还有一些选择
  1. 使用Apache Date Utilities,这将基本上为您提供Calendar(如有必要),但会返回一个新的Date对象(因此,线程安全)。
  2. 使用Joda Time处理日期/时间,这通常被认为是更好的图书馆。