我需要一个java.sql.Timestamp
对应于一小时前的值。我在这里发生了一些与日期相关的事情,因此重要的是当前时间只采样一次,其余代码使用同一时间。至于设置Timestamp
基于当前时间的毫秒。
操作Calendar
对象似乎很笨拙,因为我必须做一些事情,比如在日历中添加和减去时间,这会修改它,所以我会很高兴先克隆自己一个副本或切换它的值。
制作时间戳时只需从当前时间减去一个小时(以毫秒为单位)(1 小时 = 60 * 60 * 1000 毫秒)
Timestamp oneHourAgo = new Timestamp(System.currentTimeMillis() - (60 * 60 * 1000));
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 );
请注意,这些类遵循不可变对象模式。不是修改(“变异”)对象中的部分值,而是基于原始值实例化一个新对象。因此,另一个答案中讨论的副作用没有问题。并自动线程安全。
您可以使用这样的功能:
Timestamp subtractOneHour(Timestamp stamp)
{
long current = stamp.getTime();
long substracted = current - 60 * 60 * 1000;
return new Timestamp(substracted);
}
Calendar
除了弄乱一个对象之外,您还有一些选择-
Calendar
为你弄乱一个(如果需要的话),但会返回一个新Date
对象(所以,线程安全)。查看此线程:Java Timestamp - How can I create a Timestamp with date 23/09/2007?
重要的是当前时间只采样一次,其余代码使用相同的时间。
我建议将时间分配给一个变量,然后重新使用同一个变量..