2012-04-13 20 views
5

Estoy tratando de convertir la cadena siguiente "2012-04-13 04:08:42.794" a un tipo de fecha:fecha de Java no es la preservación de milisegundos en la conversión de formato de fecha sencilla

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; 

Pero esta es la impresión de los siguientes:

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

¿Cómo puedo obtener esta fecha para preservar los milisegundos?

+0

FYI, las viejas clases problemáticas de fecha y hora como ['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), y' java.text.SimpleDateFormat' son ahora [herencia ] (https://en.wikipedia.org/wiki/Legacy_system), suplantado por el [* java.time *] (https://docs.oracle.com/javase/9/docs/api/java/time/ package-summary.html) clases integradas en Java 8 y Java 9. Consulte [* Tutorial * de Oracle] (https://docs.oracle.com/javase/tutorial/datetime/TOC.html). –

Respuesta

8

El objeto convertedDate no, de hecho, contiene la información milisegundo. El problema aquí es que el formato del método toString() no imprime milisegundos.

hacer

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

También puede comprobar si la MS se establecen con

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

Creo que el problema es que convierto a la fecha sql. ¿Esto eliminará milisegundos? – Atma

+0

No, 'DateFormat.parse()' devuelve un 'java.util.Date', no un' java.sql.Date'. Lo que está sucediendo es que 'java.util.Date.toString()' usa un formato que no muestra los milisegundos, pero los datos están en el objeto. Haz las impresiones que te dije en mi respuesta y verás la información en milisegundos. http://docs.oracle.com/javase/6/docs/api/java/text/DateFormat.html#parse(java.lang.String) – SJuan76

1

él es mi ir en él (tratando de mantener el mismo estilo de código como el suyo):

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)); } 
} 

Salida:

Jan 13,1970 17:53:13.190 

Saludos, Erwald

1

tl; dr

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

detalles

El Answer by SJuan76 es correcta: Usted está siendo engañado por la salida mal diseñada de la Date::toString método. En su lugar, use las clases java.time.

java.time

El enfoque moderno utiliza el java.time clases que suplantaron a las clases de fecha y hora viejos molestos como Date/Calendar.

Primero convierta su cadena de entrada para cumplir con la norma ISO 8601. Reemplace el ESPACIO en el medio con un T.

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

Analizar como LocalDateTime desde su entrada carece de un indicador de offset de-UTC o zona horaria.

LocalDateTime ldt = LocalDateTime.parse(input) ; 

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

SQL

Evitar la fecha y hora relacionadas java.sql clases. Ellos también son suplantados por las clases java.time. A partir de JDBC 4.2, puede intercambiar directamente objetos java.time con su base de datos. Así que puedes olvidarte de la clase java.sql.Date y su terrible diseño pirateado.

myPreparedStatement.setObject(… , ldt) ; 

Y ...

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

Moral

moral de la historia # 1: utilizar objetos inteligentes, las cadenas no mudos.

Moraleja de la historia # 2: Utilice sólo java.time objetos. Evita las clases heredadas de fecha y hora.


Sobre java.time

El marco java.time está incorporado en Java 8 y versiones posteriores. Estas clases suplantan a las viejas y problemáticas clases de fecha y hora de legacy, como java.util.Date, Calendar, & SimpleDateFormat.

El proyecto Joda-Time, ahora en maintenance mode, recomienda la migración a las clases java.time.

Para obtener más información, consulte el Oracle Tutorial. Y busque Stack Overflow para obtener muchos ejemplos y explicaciones. La especificación es JSR 310.

El uso de un JDBC driver compatible con JDBC 4.2 o temprano, es posible intercambiar java.time objetos directamente con su base de datos. No necesita cadenas ni clases java.sql. *.

¿Dónde obtener las clases java.time?

  • Java SE 8, Java SE 9, y más tarde
    • incorporado.
    • Parte de la API estándar de Java con una implementación integrada.
    • Java 9 agrega algunas características menores y correcciones.
  • Java SE 6 y Java SE 7
    • Gran parte de la funcionalidad de back-java.time está portado a Java 6 & 7 en ThreeTen-Backport.
  • Android
    • Las versiones posteriores de las implementaciones de haces de Android de las clases java.time.
    • Para Android anterior, el proyecto ThreeTenABP se adapta a ThreeTen-Backport (mencionado anteriormente). Ver How to use ThreeTenABP….

El proyecto se extiende ThreeTen-Extra java.time con clases adicionales. Este proyecto es un terreno de prueba para posibles adiciones futuras a java.time. Puede encontrar algunas clases útiles aquí, como Interval, YearWeek, YearQuarter y more.

Cuestiones relacionadas