2016-12-26 3 views
0

Epochenzeit ist die Anzahl von Millisekunden, die seit dem 1. Januar 1970 vergangen sind. Wenn ich also zu dieser Zeit x Tage hinzufügen möchte, scheint es natürlich Millisekunden zu geben, die x Tagen entsprechen das ErgebnisHinzufügen von Tagen zu Epochenzeit [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)); 

es gibt die folgende Ausgabe

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

ich weiß, ich Calendar Klasse, dieses Problem lösen können, wollte aber nur um dieses Verhalten verstehen

Antwort

3

Sein Weil JVM behandelt Wert der Multiplikation 30 * 24 * 60 * 1000 als Int Und Multiplikationsergebnis ist außerhalb des Bereichs von Integer wird es Ergebnis geben: -1702967296 beabsichtigt von 2592000000 so sein Gebendatum kleiner als aktuelles Datum

Versuchen Im Folgenden Code:

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

Try this:

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

Dateime Klasse:

public DateTime plusDays(int days) { 
     if (days == 0) { 
      return this; 
     } 
     long instant = getChronology().days().add(getMillis(), days); 
     return withMillis(instant); 
} 
2

Sie treffen einen Integer-Überlauf mit Ihrer Nummer. 30 * 24 * 60 * 60 * 1000 = 2.592.000.000, was größer ist als eine vorzeichenbehaftete 32-Bit-Ganzzahl (2.147.483.647).

Verwenden Sie stattdessen longs, indem Sie beispielsweise L an eine der Nummern anhängen: 1000L.

Beachten Sie, dass, wenn Sie mit der Sommerzeit (ganz zu schweigen von Schaltsekunden!) Umgehen wollen, dies immer noch nicht genug ist. Aber wenn Sie davon ausgehen, dass ein Tag immer genau 24 Stunden ist, wird die Verwendung von Longs Ihr Problem beheben. (Die Zeit ist eine komplizierte Sache, und ich würde vorschlagen, eine Bibliothek wie Joda oder Java 8 der Klassen, die für Sie zu handhaben!)

0

bearbeiten Sie den Code wie folgt:

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

Es wird sicher funktionieren.

Verwandte Themen