java由于越界导致的报错

问题

两种计算时间戳的结果不一样。

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;
posted @ 2024-06-05 21:25  jihite  阅读(7)  评论(0编辑  收藏  举报