2016-12-31 9 views
0

私はGoogleの2段階認証をサポートするアプリケーションを開発中です。このアプリケーションは、「このデバイスを30日間信頼する」機能もサポートしています。Javaの現在の時刻に大きなタイムスタンプを追加する

データベースを使用して、IPアドレスや有効期限などのすべての情報を保存します。今すぐタイムスタンプSystem.currentTimeMillis() + 30 * 24 * 60 * 60 * 1000を入力して現在の時刻に30日を追加すると、現在の時刻よりも前のタイムスタンプがデータベースに挿入されます。

たとえば、現在の時刻= 1483223733000 (2016-31-12 11:36 PM UTC+1)です。 今、私はそれは時間ではなく、約19日間戻っていない30日後に控えている1481520984841 (2016-12-12 6:36 AM UTC+1)に類似した日付になる、しかし、2592000000ミリ秒である30日を(追加したとき。

答えて

3

この問題は、32ビットとしなければなりませんでした整数の最大値は2147483647なので、ミリ秒単位の30日は整数には大きすぎるため、整数は-1702967296(ミリ秒で約-19日)になります。

解決するにはこの問題は、intの代わりにlongを使用していますので、今私はします: 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(); 
    
関連する問題