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.
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). –