2009-02-11 10 views
57

J'ai une chaîne contenant le UNIX Epoch time, et j'ai besoin de le convertir en un objet date Java.Unix époque de Java objet date

String date = "1081157732"; 
DateFormat df = new SimpleDateFormat(""); // This line 
try { 
    Date expiry = df.parse(date); 
} catch (ParseException ex) { 
    ex.getStackTrace(); 
} 

La ligne marquée est là où j'ai des problèmes. Je ne peux pas déterminer quel devrait être l'argument de SimpleDateFormat(), ou même si je devrais utiliser SimpleDateFormat().

+0

Voir [ma réponse détaillée] (http://stackoverflow.com/a/20370992/642706) à une question similaire sur la conversion entre les millisecondes à jour en temps avec le code exemple en utilisant la bibliothèque Joda-Time. –

Répondre

85

Que diriez-vous juste:

Date expiry = new Date(Long.parseLong(date)); 

EDIT: selon la réponse de rde6173 et regarder de plus près à l'entrée spécifiée dans la question, « 1081157732 » semble être une époque basée secondes valeur de sorte que vous voudriez multiplier le temps de parseLong() par 1000 pour convertir en millisecondes, ce qui est ce que le constructeur date de Java utilise, donc:

Date expiry = new Date(Long.parseLong(date) * 1000); 
+4

Cela ne serait-il pas techniquement incorrect car il ne prend pas en compte les secondes intercalaires? –

+0

Oui après le * 1000L, ça marche. –

+1

Maciej, l'époque "basée sur les secondes" d'op compte déjà pour les secondes intercalaires, il est basé sur "secondes". Donc, cette réponse est correcte. – thecarpy

5
long timestamp = Long.parseLong(date) 
Date expiry = new Date(timestamp * 1000) 
0

Hum .... si je ne suis pas trompe n, le temps Epoch UNIX est en fait la même chose que

System.currentTimeMillis() 

écrit donc

try { 
    Date expiry = new Date(Long.parseLong(date)); 
} 
catch(NumberFormatException e) { 
    // ... 
} 

devrait fonctionner (et être beaucoup plus rapide que l'analyse syntaxique de date)

+2

Habituellement, le temps Unix est mesuré en secondes et non en millisecondes. –

33

Epoch est le nombre de secondes depuis le 1 janvier 1970 ..

Alors:

String epochString = "1081157732"; 
long epoch = Long.parseLong(epochString); 
Date expiry = new Date(epoch * 1000); 

Pour plus d'informations: http://www.epochconverter.com/

+1

Cela fonctionne un régal ... IDK Y cela n'a pas été vérifié comme réponse :) – Makky

+0

Merci pour cette réponse. J'étais assis ici essayant d'instancier une date d'une époque et le résultat était toujours un jour en 1970, et c'était parce que je donnais sans le savoir des Java millisecondes, pas des secondes :) –

0

Mieux encore, utilisez JodaTime. Beaucoup plus facile d'analyser les cordes et les cordes. Est-ce que le fil est également sécurisé. Il vaut le temps qu'il vous faudra pour l'implémenter.

0

Pour convertir l'horodatage des secondes en horodatage milliseconde. Vous pouvez utiliser l'API TimeUnit et soigné comme ça.

long milliSecondTimeStamp = MILLISECONDS.convert(secondsTimeStamp, SECONDS)

12

java.time

Utilisation du cadre java.time intégré dans Java 8 et versions ultérieures.

import java.time.LocalDateTime; 
import java.time.Instant; 
import java.time.ZoneId; 

long epoch = Long.parseLong("1081157732"); 
Instant instant = Instant.ofEpochSecond(epoch); 
ZonedDateTime.ofInstant(instant, ZoneOffset.UTC); # ZonedDateTime = 2004-04-05T09:35:32Z[UTC] 

Dans ce cas, vous devriez mieux utiliser ZonedDateTime pour le marquer comme date UTC fuseau horaire parce que Epoch est définie en UTC dans Unix time utilisé par Java.

ZoneOffset contient une constante pratique pour le fuseau horaire UTC, comme indiqué dans la dernière ligne ci-dessus. Sa superclasse, ZoneId peut être utilisée pour ajuster dans d'autres fuseaux horaires.

ZoneId zoneId = ZoneId.of("America/Montreal"); 
+0

Bonne réponse. Je suggère de laisser tomber le 'LocalDateTime' et juste montrer un' ZonedDateTime'. Dans la plupart des applications professionnelles, 'ZonedDateTime' est la meilleure solution. Les gens ont tendance à avoir des problèmes/confusion avec les types 'LocalXXX'. –

+0

Vous avez raison, je l'ai changé. – Przemek

Questions connexes