2015-05-09 12 views
14

In base allo SimpleDateFormat class documentation, Java non supporta la granularità del tempo al di sopra dei millisecondi nei suoi schemi di data.Analisi della data Java con precisione al microsecondo o al nanosecondo

Quindi, una stringa data come

  • 2015-05-09 00: 10: 23.999750900 // Le ultime 9 cifre denotano nanosecondi

quando analizzato tramite il modello

  • aaaa-MM-gg HH: mm: ss.SSSSSSSSS // 9 simboli 'S'

realtà interpreta l'intero numero dopo il simbolo . come (quasi 1 miliardo!) Millisecondi e non come nanosecondi, con conseguente data

  • 2015-05-20 21:52:53 UTC

cioè oltre 11 giorni prima. Sorprendentemente, l'utilizzo di un numero inferiore di simboli S produce ancora l'analisi di tutte e 9 le cifre (anziché, ad esempio, il 3 più a sinistra per .SSS).

Ci sono 2 modi per gestire correttamente questo problema:

  • Usa stringa di pre-elaborazione
  • Uso un'implementazione SimpleDateFormat personalizzato

Ci sarebbe qualche altro modo per ottenere una soluzione corretta, semplicemente fornendo un modello all'implementazione standard , senza altre modifiche al codice o manipolazione delle stringhe?

+2

* ... semplicemente fornendo un modello all'implementazione standard 'SimpleDateFormat', senza altre modifiche al codice o manipolazione di stringhe? * Ovviamente no. –

+1

Sì, sembra così. – PNS

risposta

10

No

No, non è possibile utilizzare per gestire SimpleDateFormat nanosecondi.

Ma il tuo premessa che ...

Java non supporta granularità di tempo sopra millisecondi nei suoi modelli di data

... non è più vero, come di Java 8.

java.time

SimpleDateFormat, ed i relativi java.util.Date/.Calendar classi sono ora superata dalla nuova java.time pacchetto trovato in Java 8 (Tutorial).

Le nuove classi java.time supportano la risoluzione nanosecond. Quel supporto include l'analisi e la generazione di nove cifre di secondo frazionario. Ad esempio, quando si utilizza l'API java.time.format, la lettera di modello S denota una "frazione del secondo" anziché "millisecondi" e può far fronte a valori di nanosecondi.

2013-08-20T12:34:56.123456789Z 

java.sql.Timestamp

La classe java.sql.Timestamp gestisce anche la risoluzione nanosecondo, ma in modo imbarazzante. Generalmente è meglio fare il tuo lavoro all'interno delle classi java.time.

Fino a quando i driver JDBC non vengono aggiornati per supportare direttamente i tipi di dati java.time, è possibile utilizzare i metodi toInstant e from per spostarsi avanti e indietro tra java.sql.Timestamp e java.time.

+0

Sì, sebbene il requisito fosse per una soluzione 'SimpleDateFormat', a causa del caso d'uso corrispondente. – PNS

Problemi correlati