[英]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,我想向您推薦一種更慣用的日期處理方法。
如果您只需要添加30天24小時(即24 * 30小時),請使用:
Instant.now().plus(Duration.ofDays(30)).toEpochMilli();
要么
Instant.now().plus(30, ChronoUnit.DAYS).toEpochMilli();
如果您需要根據當前的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.