2015-06-23 20 views
6

Ho un timestamp in json che proviene da un server Linux. Mi piacerebbe convertirlo in un semplice formato di data e ora usando Java.Come convertire un timestamp in JSON in data e ora normali in java?

Ho bisogno la data e l'ora nel seguente formato: hh gg-mm-aaaa: mm: ss

ecco il mio dati JSON:

[ 
    { 
    "batch_date": 1419038000 
    }, 
    { 
    "batch_date": 1419037000 
    } 
] 
+0

Come stai analizzando il Json? Guarda gson o jackson – beresfordt

+1

@pavankumarparasa Si prega di evitare di postare informazioni e dati estranei. Riduci al minimo lo scenario al minimo necessario per dimostrare il tuo problema. Vedi [Come creare un esempio minimo, completo e verificabile] (http://stackoverflow.com/help/mcve). –

risposta

7

La data di lotto

"batch_date": 1419038000, 

sembra un secondo di epoca,

so

new Date (batch_date * 1000); 

quindi utilizzare SimpleDateFormat dovrebbe fare il trucco

SimpleDateFormat sfd = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss"); 

- codice -

long batch_date = 1419038000; 
    Date dt = new Date (batch_date * 1000); 

    SimpleDateFormat sfd = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss"); 
    System.out.println(sfd.format(dt)); 

- uscita -

20-12-2014 10:13:20 
+0

Significa 'HH', non' hh'. –

+0

fisso grazie –

+0

@ScaryWombat possiamo leggere il timestamp? senza usare questi DateFormats. Intendo solo guardandolo, possiamo dire in quale anno o mese o data è simile. – Prabs

-3

quando vogliamo leggere/analizzare una stringa di valore come data, dovremmo sapere il formato della data di quella stringa di input, altrimenti avremo sbagliato da il valore

batch_date: 1419038000 qual è il formato della data di questo valore?

Se vogliamo ottenere il valore della data nel formato richiesto come nel tuo caso 'gg-mm-aaaa hh: mm: ss'. ci sono due modi possibili.

1) il valore di richiesta batch_date deve essere nel formato richiesto. oppure

2) se il valore batch_date è un altro formato, è necessario conoscere il formato originale e creare un oggetto Date con il formato originale utilizzando il metodo di analisi SimpleDateFormat e quindi convertirlo nel formato richiesto utilizzando un altro metodo di formattazione SimpleDateFormat.

3

No Such Tipo di dati

Non esiste una cosa come "JSON timestamp". JSON ha very few defined data types. Nessun tipo di data-ora tra di loro.

Come il correct Answer da stati Wombat spaventosi, il numero è apparentemente un conteggio di interi secondi dall'epoca Unix del 1970. La classe java.util.Date traccia tempo come millisecondi dal momento che il Unix epoch, piuttosto che interi secondi. Quindi devi moltiplicare per 1.000. È inoltre necessario gestire gli interi long (64 bit) anziché int (32 bit). Aggiungere un maiuscolo L ai valori letterali numerici e dichiarare qualsiasi variabile come long.

Le classi java.util.Date/.Calendar sono notoriamente problematiche. Ora sono soppiantati dallo java.time package incorporato in Java 8 e versioni successive e/o nella libreria Joda-Time di terze parti.

Varie librerie di elaborazione JSON supportano i convertitori per la creazione di oggetti java.time o Joda-Time. Oppure puoi eseguire una conversione nel tuo codice, mostrato di seguito.

Tenere presente che sia java.time che Joda-Time supportano l'assegnazione di un fuso orario. Il codice seguente assegna UTC a scopo dimostrativo, ma è possibile assegnare la zona desiderata/prevista.

Joda Time

Ecco il codice in Joda-Time 2.8.1 che mostra l'utilizzo del numero di ingresso sia come secondi o millisecondi.

long secondsSinceEpoch = 1419038000L; 
DateTime dateTimeSeconds = new DateTime(secondsSinceEpoch , DateTimeZone.UTC); 
DateTime dateTimeMillis = new DateTime(secondsSinceEpoch * 1000L , DateTimeZone.UTC); // Note the crucial "L" appended to the numeric literal. 

Discarica per consolle.

System.out.println("dateTimeSeconds: " + dateTimeSeconds); 
System.out.println("dateTimeMillis: " + dateTimeMillis); 

Quando eseguito.

dateTimeSeconds: 1970-01-17T10:10:38.000Z 
dateTimeMillis: 2014-12-20T01:13:20.000Z 

java.time

codice simile al precedente, ma utilizzando java.time di Java 8.

Instant instant = Instant.ofEpochSecond(1419038000L); 
ZonedDateTime zdtUtc = ZonedDateTime.ofInstant(instant , ZoneOffset.UTC); 
ZonedDateTime zdtMontréal = zdtUtc.withZoneSameInstant(ZoneId.of("America/Montreal")); 

Dump alla console.

System.out.println("zdtUtc: " + zdtUtc); 
System.out.println("zdtMontréal: " + zdtMontréal); 

Quando eseguito.

zdtUtc: 2014-12-20T01:13:20Z 
zdtMontréal: 2014-12-19T20:13:20-05:00[America/Montreal] 
+0

Voglio dire ... Ho un timestamp in june –

+0

Buone informazioni per il commento su Fuso orario! Mi stavo chiedendo perché ottengo ** 01 **: 13: 20.000Z e non ** 10 **: 13:20 (come Scary Wombat) per la parte a tempo! – Didier68

Problemi correlati