4

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

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

4

5 回答 5

8

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

Timestamp oneHourAgo = new Timestamp(System.currentTimeMillis() - (60 * 60 * 1000));
于 2012-08-06T18:55:55.323 回答
5

tl;博士

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

避免旧的日期时间类

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

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

Instant instant = mySqlTimestamp.toInstant();

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

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

请注意,这些类遵循不可变对象模式。不是修改(“变异”)对象中的部分值,而是基于原始值实例化一个新对象。因此,另一个答案中讨论的副作用没有问题。并自动线程安全

于 2016-09-17T21:56:56.057 回答
1

您可以使用这样的功能:

Timestamp subtractOneHour(Timestamp stamp)
{
    long current = stamp.getTime();
    long substracted = current - 60 * 60 * 1000;
    return new Timestamp(substracted);
}
于 2012-08-06T19:00:49.853 回答
0

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

  1. 使用Apache Date Utilities,它基本上会Calendar为你弄乱一个(如果需要的话),但会返回一个新Date对象(所以,线程安全)。
  2. 使用Joda Time处理日期/时间,这通常被认为是一个更好的库。
于 2012-08-06T19:04:25.990 回答
0

查看此线程:Java Timestamp - How can I create a Timestamp with date 23/09/2007?

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

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

于 2012-08-06T18:57:50.407 回答