在Java中为当前时间添加大型时间戳
问题描述:
我正在研究支持Google两步验证的应用程序。此应用程序还支持“相信此设备30天”的功能。在Java中为当前时间添加大型时间戳
我使用数据库来保存所有这些信息,如IP地址和过期时间。现在,当我填入时间戳System.currentTimeMillis() + 30 * 24 * 60 * 60 * 1000
以将30天添加到当前时间时,它会将比当前时间早的时间戳插入到数据库中。例如:当前时间= 1483223733000 (2016-31-12 11:36 PM UTC+1)
。 现在,当我加30天(这是2592000000
毫秒,它涉及到类似1481520984841 (2016-12-12 6:36 AM UTC+1)
的日期是不是提前30天,而是回到约19天的时间。
答
这个问题曾与一个32做因为一个整数的最大值是2147483647
,30天(毫秒)对于一个整数来说太大了,并且会产生一个像-1702967296
(大约-19天,以毫秒为单位)的整数。
解决这个问题,我用long
代替了int
,所以现在我这样做: System.currentTimeMillis() + 30L * 24 * 60 * 60 * 1000;
答
您可以使用Calendar
做到这一点:
Calendar cal = Calendar.getInstance();
System.out.println(cal.getTime());
System.out.println(cal.getTimeInMillis());
//cal.add(Calendar.DATE, 30);
cal.setTimeInMillis(System.currentTimeMillis() + 30L * 24 * 60 * 60 * 1000);
System.out.println(cal.getTime());
System.out.println(cal.getTimeInMillis());
答
你已经回答了为什么计算是错误的问题,但我想一个更地道的方式推荐你使用日期,如果你使用Java 8.
-
如果您需要添加30个24小时的天(即。 24 * 30小时),使用方法:
Instant.now().plus(Duration.ofDays(30)).toEpochMilli();
或
Instant.now().plus(30, ChronoUnit.DAYS).toEpochMilli();
-
如果您需要添加正好是30天(有些天可能是因为根据夏令时等),23或25个小时到当前JVM时区,使用:
ZonedDateTime.now(ZoneId.systemDefault()).plusDays(30).toInstant().toEpochMilli();
或(隐式地使用JVM时区)
ZonedDateTime.now().plusDays(30).toInstant().toEpochMilli();