2012-04-09 10 views
11

Ho un valore in colonna che è di tipo timestamp. Diciamo che ho un valore 2007-05-04 08: 48: 40,969774Come stampare fino a 6 cifre di precisione per il valore dei secondi

Ora, quando si cerca di recuperare il valore dal database e restituire questo valore timestamp a una funzione, quello SimpleDateFormatter modello dovrei usare in modo che anche la parte frazione accanto ai secondi viene restituita.

ho usato hh AAAA-MM-DD: mm: ss, ma che restituisce solo fino ai secondi e ignora la frazione presente accanto ai secondi (.969774). Ho bisogno di aiuto per restituire anche questa parte della frazione, con una precisione di 6 cifre.

+2

Dai un'occhiata alla documentazione: http://docs.oracle.com/javase/6/docs/api/java/text/SimpleDateFormat.html. C'è una lista di specificatori di formato lì. –

+1

chi ha diminuito le cure per spiegare perché? Non c'è niente di sbagliato nella domanda. È possibile ottenere la milionesima precisione in java. –

+2

+1 Penso che sia una domanda ragionevole. Immagino che il downvoter non si sia reso conto che trattare con micro-secondi a) non è banale o b) abbastanza possibile. –

risposta

6

Le modalità predefinite di formattazione di java.util.Date (o java.sql.Timestamp) hanno una precisione millisecondo. È possibile utilizzare yyyy-MM-dd hh:mm:ss.SSS per ottenere quella precisione millisecondo.

A java.sql.Timestamp in realtà ha (fino a) nanosecondi di precisione (supponendo che il server di database e il driver effettivamente lo supportano). Il modo più semplice per formattarlo in Java 8 è convertire il timestamp in java.time.LocalDateTime (usando Timestamp.toLocalDateTime()) e utilizzare le opzioni di formattazione java.time in java.time.format.DateTimeFormatter che supportano fino a nanosecondi.

Se si utilizza Java 7 o versioni precedenti, sarà necessario un ulteriore sforzo, poiché i normali formattatori di data non lo supportano. Ad esempio, è possibile utilizzare un dataformatter con il modello yyyy-MM-dd hh:mm:ss (per formattare solo fino a secondi) e aggiungere i secondi nano secondari (con il padding di zero appropriato) di Timestamp.getNanos().

+0

corretto, l'ho provato con SSS a alla fine e sto arrivando fino a millisecondi di precisione. Ma voglio la precisione del milionesimo secondo. Eventuali suggerimenti? Prima di tutto, è possibile con JAVA –

2

Devi avere un modo per ottenere un timestamp di micro secondi. Io uso System.currentTimeMillis() con System.nanoTime() in combinazione. Allora hai bisogno di un modo per visualizzarlo. Puoi dividerlo per 1000 e visualizzare millisecondi come di consueto, quindi visualizzare le ultime 3 cifre del tempo. cioè hanno un tempo che è come

long timeUS = System.currentTimeMillis() * 1000 + micros; 

ecco un esempio più dettagliato

HiresTimer.java e HiresTimerTest.java

stampe il test

2012/04/09T14:22:13.656008 
2012/04/09T14:22:13.656840 
2012/04/09T14:22:13.656958 
2012/04/09T14:22:13.657066 
.... 
2012/04/09T14:22:13.665249 
2012/04/09T14:22:13.665392 
2012/04/09T14:22:13.665473 
2012/04/09T14:22:13.665581 

EDIT: Il codice in questione è

private static final SimpleDateFormat SDF = new SimpleDateFormat("yyyy/MM/dd'T'HH:mm:ss.SSS"); 
private static final DecimalFormat DF = new DecimalFormat("000"); 

public static String toString(long timeUS) { 
    return SDF.format(timeUS/1000) + DF.format(timeUS % 1000); 
} 
+7

'System.nanoTime()' non restituisce un valore che ha alcuna correlazione con un tempo assoluto. È utile solo per misurare il tempo trascorso tra due invocazioni di 'System.nanoTime()'. http://stackoverflow.com/q/1712205/260633 – Dev

+0

E può misurare il tempo trascorso da currentTimeMillis che significa che puoi avere una buona idea di cosa sono i micro-secondi. –

+0

'System.nanoTime()' non può misurare nulla tranne il tempo trascorso dall'ultima chiamata a 'System.nanoTime()'. L'epoca è indefinita. Quindi è utile solo in confronto a se stesso. – Dev

1

La gestione dei nanosecondi in Java non è banale. Non riesco a vedere alcuna soluzione elegante diverso da trattare con loro in modo separato (il formato della data e l'ora con SimpleDateFormat e nanosecondi con DecimalFormat), per esempio, come nel seguente esempio:

 

package test; 

import java.sql.Timestamp; 
import java.text.DateFormat; 
import java.text.DecimalFormat; 
import java.text.NumberFormat; 
import java.text.SimpleDateFormat; 
import java.util.Date; 


public class Main { 

    public static void main(String[] args) { 
    Main m = new Main(); 
    m.start(); 
    } 

    private void start() { 
    long time = System.currentTimeMillis(); 
    Date d = new Date(time); 
    Timestamp t = new Timestamp(time); 
    t.setNanos(123456789); 
    System.out.println(d); 
    System.out.println(t); 
    DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss'.'"); 
    NumberFormat nf = new DecimalFormat("000000000"); 
    System.out.println(df.format(t.getTime()) + nf.format(t.getNanos())); 
    } 
} 
 

L'output prodotto è (in il mio paese, il mio locale):

 
Mon Apr 09 16:27:27 CEST 2012 
2012-04-09 16:27:27.123456789 
2012-04-09 16:27:27.123456789 
+0

Il problema è che i micro/nano-secondi sono sempre zero. –

+0

Suppongo che possano essere impostati dal sottosistema del database (in base alla domanda). Ho modificato il codice per dimostrare che ... –

+0

In realtà, la domanda riguardava i microsecondi non i nanosecondi. –

2

In Java 8 e versioni successive, il pacchetto java.time ha il supporto per l'analisi e la manipolazione di data/volte per nanosecondo precisione. Ciò significa fino a 9 cifre nella frazione di secondo.

+1

Potresti fornire ed esempio? – Jason

Problemi correlati