2012-03-17 8 views
16

Ho visto questa domanda più volte e nessuna delle risposte sembra essere quella di cui ho bisogno.Conversione di Epoch per la stringa di data e ora

Ho una variabile di tipo lungo che ha un tempo di epoca memorizzato in esso.

Quello che voglio fare è convertirlo in una stringa

per esempio, se il tempo dell'epoca conservato era per oggi la stringa finale sarebbe il seguente:

17/03/2012

Come sarebbe io a questo?

risposta

26

Guardare in SimpleDateFormat

SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy"); 
sdf.format(new Date(myTimeAsLong)); 
+0

Ive lo ha ottenuto per stampare una stringa nel formato corretto ma stampa la data errata che dà la data di oggi come 16/00/1970. Il Long usato era 1332026487. – nexus490

+0

È perché potresti dover giocare con il parametro che hai passato nel costruttore. Puoi trovare tutte le possibilità di visualizzazione nell'API Jav – Reinard

+4

Questa risposta: sta stampando il * minuto * invece di * mese *; ignora la scelta della cultura (che è molto importante); ignora la scelta del fuso orario (che è incredibilmente importante). Devi davvero pensare a queste cose: non è di aiuto (IMO) ignorarle. –

20

Faresti creare un Date dal long - questo è facile:

Date date = new Date(epochTime); 

Nota che epochTime qui dovrebbe essere espresso in millisecondi dal epoca - se hai secondi fin dall'epoca, si moltiplicano per 1000.

Quindi devi creare un SimpleDateFormat specificando il modello, la cultura e il fuso orario pertinenti. Per esempio:

SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy", Locale.US); 
format.setTimeZone(...); 

quindi utilizzare tale per formattare la data in una stringa:

String text = format.format(date); 
+0

Cosa metterei per l'argomento del fuso orario? – nexus490

+0

@ nexus490: Bene, in che fuso orario si desidera rappresentare il valore? Ad esempio, tra un'ora sarà il 18/03/2012 nel * mio * fuso orario, ma negli Stati Uniti sarà comunque il 17/03/2012, per lo stesso numero di millisecondi dall'epoca. Quale sarebbe la risposta giusta? Questo è qualcosa che solo tu * conosci, come sai i requisiti delle tue applicazioni (si spera). Forse vuoi l'UTC. Forse vuoi il fuso orario locale del sistema. Forse vuoi il fuso orario locale dell'utente. –

+0

Grazie per aver sottolineato questo: "se hai ** secondi ** dall'epoca, moltiplica per ** 1000 **." – Metallica

0

È necessario essere consapevoli del fatto che il tempo dell'epoca in java è in millisecondi, mentre quello che stai convertendo potrebbe essere in secondi. Assicurati che entrambi i lati delle conversioni siano in millisecondi, quindi puoi recuperare i parametri della data dall'oggetto Date.

+0

E perché dovrei convertire i millisecondi in millisecondi? –

+0

errore mio, voglio dire che dovresti assicurarti che entrambi i lati della conversione siano in millisecondi. – Ajibola

2

Joda Time

Se da tempo all'epoca si intende un conteggio di millisecondi dal primo istante del 1970 in UTC, allora ecco qualche esempio di codice che utilizza la libreria Joda-Time ...

DateTimeZone timeZone = DateTimeZone.forID("Europe/Paris"); 
DateTime dateTime = new DateTime(yourMilliseconds, timeZone); 
String output = DateTimeFormat.forStyle("S-").withLocale(Locale.CANADA_FRENCH).print(dateTime); 

Altro Epoche

Questa definizione di epoca è comune a causa del suo uso all'interno di Unix. Ma attenzione che almeno uno couple dozen epoch definitions viene utilizzato da vari sistemi di computer.

11
Date date = new Date(String); 

questo è obsoleto.

soluzione

Date date = new Date(1406178443 * 1000L); 
    DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); 
    format.setTimeZone(TimeZone.getTimeZone("Etc/UTC")); 
    String formatted = format.format(date); 

assicurarsi moltiplicare per 1000L

+3

Solo un commento secondario, è necessario modificare HH: MM: ss.SSS in HH: mm: ss.SSS - MM è il mese e non i minuti. – Leo

+0

grazie Damith: D –

0

Prova questo ...

campione Epoch timestamp è 1414492391238

Metodo:

public static String GetHumanReadableDate(long epochSec, String dateFormatStr) { 
    Date date = new Date(epochSec * 1000); 
    SimpleDateFormat format = new SimpleDateFormat(dateFormatStr, 
      Locale.getDefault()); 
    return format.format(date); 
} 

Usabilità:

long timestamp = Long.parseLong(engTime)/1000; 
String engTime_ = GetHumanReadableDate(timestamp, "dd-MM-yyyy HH:mm:ss aa"); 

Risultato:

28-10-2014 16:03:11 pm

Felice di codifica

+1

3 problemi con questa risposta. Questa risposta ignora la questione cruciale del fuso orario. Questa risposta utilizza un formato diverso da quello richiesto nella domanda. E questa risposta essenzialmente replica tre altre risposte pubblicate mesi fa. Non vedo nessun valore aggiunto qui. –

0

basa su risposte precedenti, passando sistema predefinito Locale e TimeZone ...

String epochToIso8601(long time) { 
    String format = "yyyy-MM-dd HH:mm:ss"; 
    SimpleDateFormat sdf = new SimpleDateFormat(format, Locale.getDefault()); 
    sdf.setTimeZone(TimeZone.getDefault()); 
    return sdf.format(new Date(time * 1000)); 
} 
0

provare questo

Date date = new Date(1476126532838L); 
DateFormat format = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss"); 
format.setTimeZone(TimeZone.getTimeZone("Etc/UTC")); 
String formatted = format.format(date); 
format.setTimeZone(TimeZone.getTimeZone("Asia/Colombo"));//your zone 
formatted = format.format(date); 
System.out.println(formatted);