java由於越界導致的報錯

jihite發表於2024-06-05

問題

兩種計算時間戳的結果不一樣。

int days = 30;
Instant now = Instant.now();
long timestamp_cur = now.toEpochMilli();
long nowPre = timestamp_cur - 1000 * 60 * 60 * 24 * days;

Instant threeDaysAgo = now.minus(days, ChronoUnit.DAYS);
long nowPre2 = threeDaysAgo.toEpochMilli();
System.out.println(String.format("nowPre: %d, nowPre2: %d, minus:%s", nowPre, nowPre2, nowPre-nowPre2));

當days=10,20時是一致的, 但當days=30時有差異。

原因

int 最大值:2147483647 (231-1), 當days=30時結果時2592000000, 超過int最大值,導致越界。

改正

顯性指定大數的型別

long nowPre = timestamp_cur - 1000L * 60 * 60 * 24 * days;

相關文章