2012-04-13 16 views
5

Sto cercando di convertire la seguente stringa "2012-04-13 04:08:42.794" ad un tipo di data:data di Java non è preservare millisecondi nella conversione con il formato semplice della data

SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss.SSS"); 

    Date convertedDate; 
    try { 
     convertedDate = dateFormat.parse(dateString); 
     System.out.println(" in utils: "+convertedDate.toString()); 
    } catch (ParseException e) { 
     e.printStackTrace(); 
     return null; 
    } 


    //----------------- i think this is the problem 
java.sql.Date sqlDate = new java.sql.Date(convertedDate.getTime()); 
     System.out.println("sql: "+sqlDate.toString()); 
     return sqlDate; 

Ma questo sta stampando il seguente:

in utils: Fri Apr 13 04:08:42 PDT 2012 

Come posso ottenere questa data per conservare i millisecondi?

+0

FYI, le fastidiose classi di data e ora come ['java.util.Date'] (https://docs.oracle.com/javase/9/docs/api/java/util/Date.html) , ['java.util.Calendar'] (https://docs.oracle.com/javase/9/docs/api/java/util/Calendar.html) e' java.text.SimpleDateFormat' sono ora [legacy ] (https://en.wikipedia.org/wiki/Legacy_system), soppiantato dal [* java.time *] (https://docs.oracle.com/javase/9/docs/api/java/time/ package-summary.html) classi integrate in Java 8 e Java 9. Vedere [* Tutorial * di Oracle] (https://docs.oracle.com/javase/tutorial/datetime/TOC.html). –

risposta

8

L'oggetto convertedDate in effetti contiene le informazioni millisecondo. Il problema qui è che il formato del metodo toString() non stampa millisecondi.

fare

System.out.println(" in utils: " + dateFormat.format(convertedDate)); 

Si può anche verificare se il ms sono impostate con

System.out.println("millis: " + convertedDate.getTime()); 
+0

Penso che il problema è che mi converto in data sql. Questo si sbarazzerà di millisecondi? – Atma

+0

No, 'DateFormat.parse()' restituisce un 'java.util.Date', non un' java.sql.Date'. Quello che sta succedendo è che 'java.util.Date.toString()' utilizza un formato che non mostra i millisecondi, ma i dati sono nell'oggetto. Fai le impronte che ti ho detto nella mia risposta e vedrai le informazioni del millisecondo. http://docs.oracle.com/javase/6/docs/api/java/text/DateFormat.html#parse(java.lang.String) – SJuan76

1

Lui è il mio andare a esso (cercando di mantenere lo stesso stile codice come il vostro):

import java.util.*; 
import java.text.*; 
public class main { 
public static void main(String[] args)throws Exception { 
long yourmilliseconds = 1119193190; 
SimpleDateFormat sdf = new SimpleDateFormat("MMM dd,yyyy HH:mm:ss.SSS"); 

Date resultdate = new Date(yourmilliseconds); 
System.out.println(sdf.format(resultdate)); } 
} 

Uscita:

Jan 13,1970 17:53:13.190 

saluti, Erwald

1

tl; dr

myPreparedStatetment.setObject( 
    … , 
    LocalDateTime.parse(
     "2012-04-13 04:08:42.794".replace(" " , "T") 
    ) 
) 

dettagli

Il Answer by SJuan76 è corretta: Stai per essere ingannati dall'uscita mal progettato del Metodo Date::toString. Utilizzare invece le classi java.time.

java.time

L'approccio moderno utilizza il java.time classi che soppiantarono le classi data-ora vecchi problematici, come Date/Calendar.

Prima convertire la stringa di input in modo che sia conforme allo standard ISO 8601. Sostituisci lo SPAZIO nel mezzo con uno T.

String input = "2012-04-13 04:08:42.794".replace(" " , "T") ; 

Parse come LocalDateTime dal vostro input manca un indicatore di offset da-UTC o il fuso orario.

LocalDateTime ldt = LocalDateTime.parse(input) ; 

ldt.toString(): 2012-04-13T04: 08: 42.794

SQL

evitare il data-ora legate java.sql classi. Anche loro sono soppiantati dalle classi java.time. A partire da JDBC 4.2, è possibile scambiare direttamente gli oggetti java.time con il proprio database. Così puoi dimenticare tutto sulla classe java.sql.Date e il suo terribile design hackerato.

myPreparedStatement.setObject(… , ldt) ; 

E ...

LocalDateTime ldt = myResultSet.getObject(… , LocalDateTime.class) ; 

morale

Morale della favola # 1: utilizzare oggetti intelligenti, stringhe non muti.

Morale della favola # 2: Usare solo java.time oggetti. Evita le classi di data e ora legacy.


Chi java.time

Il quadro java.time è costruito in Java 8 e versioni successive. Queste classi soppiantano le fastidiose classi di data legacy come java.util.Date, Calendar, & SimpleDateFormat.

Il progetto Joda-Time, ora in maintenance mode, consiglia la migrazione alle classi java.time.

Per ulteriori informazioni, vedere Oracle Tutorial. E cerca Stack Overflow per molti esempi e spiegazioni. La specifica è JSR 310.

Utilizzando un JDBC driver compatibile con JDBC 4.2 o poi, si può scambiare java.time oggetti direttamente con il database. Nessuna necessità di stringhe o classi java.sql. *.

Dove ottenere le classi java.time?

  • Java SE 8, Java SE 9, e più tardi
    • incorporato.
    • Parte dell'API Java standard con un'implementazione in bundle.
    • Java 9 aggiunge alcune funzionalità e correzioni minori.
  • Java SE 6 e Java SE 7
    • Molte delle funzionalità java.time è di back-porting per Java 6 .
  • Android
    • versioni successive di implementazioni fascio Android delle classi java.time.
    • Per Android precedente, il progetto ThreeTenABP si adatta a ThreeTen-Backport (menzionato sopra). Vedi How to use ThreeTenABP….

Il progetto ThreeTen-Extra java.time prolunga con classi aggiuntive. Questo progetto è un terreno di prova per possibili aggiunte future a java.time. È possibile trovare alcune classi utili come Interval, YearWeek, YearQuarter e more.

Problemi correlati