【发布时间】:2018-04-12 04:04:47
【问题描述】:
我今天遇到了来自此类代码的奇怪的 java 转换问题
new Date(System.currentTimeMillis() - 1000 * 60 * 60 * 24 * 31)
这应该在现在 31 天之前给出日期,但在 16 天之后返回日期。这显然是因为
1000 * 60 * 60 * 24 * 31
被评估为整数并溢出。
new Date(System.currentTimeMillis() - 1000L * 60 * 60 * 24 * 31)
按预期工作
我认为 java 应该将整个表达式转换为 Long 因为第一个操作数是 Long System.currentTimeMillis() 但由于某种我不明白的原因在这里没有发生。硬编码常量是否有一些例外是 int ?
【问题讨论】:
-
为什么不直接使用Java提供的
LocalDateTime呢?这样就可以了:LocalDateTime.now().minusDays(31); -
哦,还要回答您的问题:您所有的数字都是整数,
*运算符优先于-运算符,因此只有在溢出已经发生之后才会进行转换。 -
1000 * 60 * 60 * 24 * 31是一个整数。然后你从一个 long 中减去它并得到另一个 long。但是 int 在减法之前就已经溢出了。 -
现在我明白了,小学数学,就像
System.currentTimeMillis() - (1000 * 60 * 60 * 24 * 31)for java -
这意味着使首字母缩写词发音:-) 实际上,它的意思是“订单”;即权力,根源等