簡體   English   中英

在Java中為當前時間添加大時間戳

[英]Adding a large timestamp to the current time in Java

我正在開發一個支持Google兩步驗證的應用程序。 此應用程序還支持“可信任此設備30天”的功能。

我使用數據庫保存所有這些信息,例如IP地址和到期時間。 現在,當我填寫時間戳System.currentTimeMillis() + 30 * 24 * 60 * 60 * 1000以將30天添加到當前時間時,它將在數據庫中插入比當前時間早的時間戳。

例如:當前時間= 1483223733000 (2016-31-12 11:36 PM UTC+1) 現在,當我加上30天(即2592000000毫秒)時, 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;

您已經回答了為什么計算錯誤的問題,但是如果您使用Java 8,我想向您推薦一種更慣用的日期處理方法。

  1. 如果您只需要添加30天24小時(即24 * 30小時),請使用:

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

    要么

     Instant.now().plus(30, ChronoUnit.DAYS).toEpochMilli(); 
  2. 如果您需要根據當前的JVM時區精確地添加30天(由於夏令時等原因,有時可能需要23或25小時,因此請使用):

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

    或(隱式使用JVM時區)

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM