我正在开发一个支持Google两步验证的应用程序。此应用程序还支持“可信任此设备30天”的功能。
我使用数据库保存所有这些信息,例如IP地址和到期时间。现在,当我填写时间戳System.currentTimeMillis() + 30 * 24 * 60 * 60 * 1000以将当前时间增加30天时,它将比当前时间早的时间戳插入数据库中。
System.currentTimeMillis() + 30 * 24 * 60 * 60 * 1000
例如:当前时间= 1483223733000 (2016-31-12 11:36 PM UTC+1)。现在,当我加上30天(2592000000毫秒)时,得出的日期1481520984841 (2016-12-12 6:36 AM UTC+1)不是30天,而是大约19天。
1483223733000 (2016-31-12 11:36 PM UTC+1)
2592000000
1481520984841 (2016-12-12 6:36 AM UTC+1)
此问题与32位整数溢出有关。由于整数的最大值为2147483647,所以30天(以毫秒为单位)对于一个整数来说太大了,并且会导致一个整数-1702967296(例如,大约-19天(以毫秒为单位))。
2147483647
-1702967296
为了解决此问题,我使用long而不是int。所以现在我做了: System.currentTimeMillis() + 30L * 24 * 60 * 60 * 1000;
long
int
System.currentTimeMillis() + 30L * 24 * 60 * 60 * 1000;