2016-12-31 56 views
0

我正在研究支持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天的时间。

回答

3

这个问题曾与一个32做因为一个整数的最大值是2147483647,30天(毫秒)对于一个整数来说太大了,并且会产生一个像-1702967296(大约-19天,以毫秒为单位)的整数。

解决这个问题,我用long代替了int,所以现在我这样做: System.currentTimeMillis() + 30L * 24 * 60 * 60 * 1000;

0

您可以使用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()); 
1

你已经回答了为什么计算是错误的问题,但我想一个更地道的方式推荐你使用日期,如果你使用Java 8.

  1. 如果您需要添加30个24小时的天(即。 24 * 30小时),使用方法:

    Instant.now().plus(Duration.ofDays(30)).toEpochMilli(); 
    

    Instant.now().plus(30, ChronoUnit.DAYS).toEpochMilli(); 
    
  2. 如果您需要添加正好是30天(有些天可能是因为根据夏令时等),23或25个小时到当前JVM时区,使用:

    ZonedDateTime.now(ZoneId.systemDefault()).plusDays(30).toInstant().toEpochMilli(); 
    

    或(隐式地使用JVM时区)

    ZonedDateTime.now().plusDays(30).toInstant().toEpochMilli();