我有一个预定的工作,我想计算到最后30天的时间。为此,我收到一个警告,表明在表达式中检测到数字溢出。我怎样才能安全地给出30天?
@Override
@Scheduled(cron = "0 5 5 * * ?")
public void deleteRepliesAutomatically() {
if(schedulerActive.equals("true")) {
Session session = this.sessionFactory.getCurrentSession();
long now = System.currentTimeMillis();
// Below line gives warning.
long nowMinus1Week = now - (1000 * 60 * 60 * 24 * 30);
Timestamp nowMinus1WeekAsTimeStamp = new Timestamp(nowMinus1Week);
Query query = session.createQuery("from Replies as cm where cm.sortTimeStamp <:limit");
query.setParameter("limit", nowMinus1WeekAsTimeStamp);
List<Replies> repliesList = query.list();
for (Replies replies : repliesList) {
session.delete(replies);
session.flush();
}
}
}
谢谢。
答案 0 :(得分:5)
问题是你的表达式(1000 * 60 * 60 * 24 * 30)
(导致2.592.000.000)是一个纯int
- 计算溢出(Integer.MAX_VALUE
是2.147.483.647)。
只需制作例如第一个数字为long
,添加了L
:
(1000L * 60 * 60 * 24 * 30)
这将使用足以容纳该值的long
数据类型进行整个计算。
答案 1 :(得分:4)
piet.t的答案是正确的,以解决手头的问题。
但是使用TimeUnit枚举从一个单元到另一个单元进行计算会更好。 例如,要有一周的毫秒数:
long millis = TimeUnit.DAYS.toMillis(7);
您还可以为DAYS执行静态导入。