对纪元时间2147483647L意味着什么?

时间:2018-09-24 05:59:31

标签: java push-notification unix-timestamp integer-overflow

我刚刚遇到了在Android中生成用于通知的ID的问题。

我正在处理一些通知处理SDK,他们正在使用以下代码来生成通知ID:

private int generateTimestampId() {
    return (int)(new Date().getTime() % 2147483647L);
}

这可能是一个很好的解决方案,但我无法理解% 2147483647L在新纪元的背景下代表什么

(请注意:new Date().getTime()返回自1970年1月1日格林威治标准时间00:00:00以来的毫秒数)

1 个答案:

答案 0 :(得分:1)

可以这样做,以防止在将long缩小为int时出现负值。考虑以下代码:

long value = 1L + Integer.MAX_VALUE; // anything past max integer
int i1 = (int) value; // -2147483648
int i2 = (int) (value % 2147483647L); // 1

使用% 2147483647L,代码可确保在将其限制为Integer.MAX_VALUE之前,该数字始终小于int(即2147483647)。

在生成的ID的上下文中或多或少有意义,在这种情况下,我们很少使用负数。