我需要一小时前对应的java.sql.Timestamp
值。我在这里发生了一些与日期有关的事情,因此重要的是当前时间只采样一次,其余代码使用同一时间。至于基于ms的当前时间设置Timestamp
操纵Calendar
对象看起来非常笨拙,因为我必须做一些事情,比如在日历中添加和减去时间,这会修改它,所以我会很高兴自己克隆自己的副本或切换它的价值。
答案 0 :(得分:6)
在制作时间戳(1小时= 60 * 60 * 1000毫秒)时,只需减去当前时间的一小时(以毫秒为单位)
Timestamp oneHourAgo = new Timestamp(System.currentTimeMillis() - (60 * 60 * 1000));
答案 1 :(得分:3)
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
对象 -
Calendar
(如有必要),但会返回一个新的Date
对象(因此,线程安全)。