"Unixtime" in Java

258

Date.getTime () gibt Millisekunden seit dem 1. Januar 1970 zurück. Unixtime ist Sekunden seit dem 1. Januar 1970. Ich codiere normalerweise nicht in Java, arbeite aber an einigen Fehlerkorrekturen. Ich habe:

Date now = new Date();      
Long longTime = new Long(now.getTime()/1000);
return longTime.intValue();

Gibt es einen besseren Weg, um Unixtime in Java zu bekommen?

Gary Richardson
quelle
27
Da Sie es in ein int umgewandelt haben, haben Sie das Problem des Jahres 2038 eingeführt (das Äquivalent von Y2K für Unix). Dann erreicht die Unix-Epoche 2 Milliarden und wechselt zum Negativ. Das Update besteht darin, auf 64-Bit-Unix umzusteigen. Das Java-Äquivalent ist, es so lange zu belassen.
John M
1
Ja, das ist mir bewusst. Der Code, mit dem dies verbunden ist, erwartet einen 32-Bit-Int für Unixtime.
Gary Richardson
157
2038 kommt bald.
Pacerier
Gibt es einen richtigen Namen oder Standard für currentTimeMillis? Ich neige dazu, es in meiner Dokumentation als Millisekundenversion der UNIX-Zeit zu bezeichnen.
Tom
1
Wenn Sie möchten, dass Ihre Software den Überlauf überlebt, verwenden Sie longnicht int. Es gibt wirklich keinen Grund, inteinen Zeitstempel zu verwenden, es sei denn, Sie verwenden eine andere Granularität wie 1 Sekunde = 4 Sekunden usw. Entweder das, oder Sie verbergen Ihren Code, damit zukünftige Generationen nicht sehen können, wie inkompetent Sie waren.
Bryc

Antworten:

475

Vermeiden Sie die Erstellung des Datumsobjekts mit System.currentTimeMillis () . Eine Division durch 1000 bringt Sie zur Unix-Epoche.

Wie in einem Kommentar erwähnt, möchten Sie normalerweise ein primitives Long (Kleinbuchstabe-L Long) und kein Boxed Object Long (Großbuchstabe-L Long) für den Typ der unixTime-Variablen.

long unixTime = System.currentTimeMillis() / 1000L;
John M.
quelle
3
Erwägen Sie auch, primitive long anstelle von Autoboxing zu Long zu verwenden, es sei denn, Sie möchten die Zahl als Objekt behandeln (wie sie in eine Sammlung
einfügen
9
Das Java 32-Bit-Int entspricht 32-Bit-Plattformen (und dem Problem des Jahres 2038). 64-Bit-Plattformen verwenden einen größeren Datentyp time_t. Java ist diesem Aufzählungszeichen ausgewichen, indem es eine lange Rückgabe für System.currentTimeMillis () verwendet hat. Wenn Sie zu int konvertieren, führen Sie das Problem des Jahres 2038 erneut ein. Siehe en.wikipedia.org/wiki/Year_2038_problem#Solutions
John M
1
Ich denke, Sie irren sich in einem Punkt: Es gibt keinen Unterschied zwischen einem Kleinbuchstaben "L" und einem Großbuchstaben, wenn Sie sie in solchen numerischen Literalen verwenden. docs.oracle.com/javase/specs/jls/se7/html/jls-3.html#jls-3.10.1
matt forsythe
5
Die oben erläuterte Großschreibungsdiskussion befasste sich mit dem Datentyp. Primitive "long" vs "java.lang.Long" Klasseninstanz. Sie sprechen über den Suffix-Buchstaben im langen Literal, der meiner Meinung nach in Groß- oder Kleinbuchstaben geschrieben werden kann. Obwohl Kleinbuchstaben "l" der Ziffer "1" sehr ähnlich sehen, ist es viel besser lesbar, Großbuchstaben "L" zu verwenden.
John M
1
Klicken Sie auf den Link zur Dokumentation. Die Rückgabe ist definiert als die Anzahl der Millisekunden seit dem 1.1.1970 in der UTC-Zeitzone. Sie möchten Zeitzonen? Schauen Sie sich java.util.Calendar an.
John M
273

Java 8 hat eine neue API zum Arbeiten mit Datum und Uhrzeit hinzugefügt. Mit Java 8 können Sie verwenden

import java.time.Instant
...
long unixTimestamp = Instant.now().getEpochSecond();

Instant.now()Gibt einen Instant zurück , der die aktuelle Systemzeit darstellt. Mit erhalten getEpochSecond()Sie die Epoche Sekunden (Unix-Zeit) von der Instant.

micha
quelle
4
Was ist der Unterschied zwischen Instant.now().getEpochSecond(), new Date().getTime()undSystem.currentTimeMillis()
SohamC
2
Ein Unterschied besteht darin, dass erstere in Sekunden angegeben sind, während die beiden letzteren in Millisekunden angegeben sind. Es kann andere geben oder nicht.
Super_Aardvark
3
import java.time.Instantwenn Sie in Scala
Akauppi
4
Überprüfen Sie auch diese Seite für eine detaillierte Beschreibung ... Hat mir gefallen
Subroto
1
Beachten Sie, dass Sie diese Methode nicht mit älteren Android-API-Ebenen verwenden können.
Ali Nadalizadeh