2016-12-26 9 views
0

エポックタイムは、1970年1月1日から経過したミリ秒数です。したがって、そのときにx日を追加する場合は、xに相当するミリ秒結果エポックタイムに日数を加算する[Java]

Date date = new Date(); 
System.out.println(date); 
// Adding 30 days to current time 
long longDate = date.getTime() + 30*24*60*60*1000; 
System.out.println(new Date(longDate)); 

はそれが

Mon Dec 26 06:07:19 GMT 2016 
Tue Dec 06 13:04:32 GMT 2016 

は、私はこの問題を解決するためにCalendarクラスを使用することができます知っている次のような出力が得られますが、ちょうどこの行動について理解したかった

答えて

3

そのため、JVMは乗算値30 * 24 * 60 * 1000をIntとして扱うため、結果はIntegerの範囲外です。-1702967296は2592000000の予定ですので、その日付は現在の日付より小さくなります

はコードの下には試してみてください。

public class Test { 
public static void main(final String[] args) { 
    Date date = new Date(); 
    System.out.println(date); 
    // Adding 30 days to current time 
    System.out.println(30 * 24 * 60 * 60 * 1000); // it will print -1702967296 
    long longDate = (date.getTime() + TimeUnit.DAYS.toMillis(30)); 
    System.out.println(TimeUnit.DAYS.toMillis(30)); 
    date = new Date(longDate); 
    System.out.println(date); 
} 
} 
0

はこれを試してみてください:

DateTime timePlusTwoDays = new DateTime().plusDays(days); 
long longDate = timePlusTwoDays.getTime(); 
System.out.println(new Date(longDate)); 

Dateimeクラスがあります。

2

数値がオーバーフローしています。 30 * 24 * 60 * 60 * 1000 = 2,592,000,000であり、符号付き32ビット整数より大きい(2,147,483,647)。

代わりに、番号1000LのいずれかにLを追加してlongsを使用します。

夏時間に対応したい場合(閏秒の何も言わないでください)、それでも十分ではありません。しかし、1日が常に正確に24時間であると想定したい場合は、ロングを使用すると問題が解決されます。 (時間は複雑なものである、と私はあなたのためにそれを処理するためにジョダまたはJava 8のクラスのようなライブラリを使用することをお勧めし!)

0

編集し、あなたのコードを次のように

long longDate = date.getTime() + 30*24*60*60*1000L; 

をそれは確かに動作します。

関連する問題