Estoy usando JodaTime 1.6.2.
tengo un LocalDate
que necesito convertir a un (Joda) LocalDateTime
o un java.sqlTimestamp
para ormapping.
La razón de esto es que he descubierto cómo convertir entre a LocalDateTime
y ajava.sql.Timestamp
:
LocalDateTime ldt = new LocalDateTime();
DateTimeFormatter dtf = DateTimeFormatter.forPattern("yyyy-MM-dd HH:mm:ss");
Timestamp ts = Timestamp.valueOf(ldt.toString(dtf));
Entonces, si solo puedo convertir entre LocalDate
y LocalDateTime
, entonces puedo hacer la conversión continua a java.sql.Timestamp
. ¡Gracias por cualquier empujón en la dirección correcta!
java.sql.Timestamp
clase ahora es heredada, suplantada por las clases java.time , específicamente porInstant
.Respuestas:
JodaTime
Para convertir JodaTime's
org.joda.time.LocalDate
ajava.sql.Timestamp
, solo hazPara convertir JodaTime's
org.joda.time.LocalDateTime
ajava.sql.Timestamp
, solo hazJavaTime
Para convertir Java8
java.time.LocalDate
ajava.sql.Timestamp
, solo hazPara convertir Java8
java.time.LocalDateTime
ajava.sql.Timestamp
, solo hazfuente
LocalDateTime
a,DateTime
ya que no todos losLocalDateTime
s son válidosDateTime
. Fuente: joda-time.sourceforge.net/faq.html#illegalinstant y solo me encuentro con esto.Timestamp#valueOf()
método acepta ya que Java SE 1.8 también aLocalDateTime
.La mejor manera de usar la API de tiempo de Java 8:
Para usar con JPA, agregue su modelo ( https://weblogs.java.net/blog/montanajava/archive/2014/06/17/using-java-8-datetime-classes-jpa ):
Entonces ahora es el tiempo relativo de la zona horaria independiente. Además es fácil hacer:
Formateo:
ACTUALIZACIÓN: postgres 9.4.1208, HSQLDB 2.4.0, etc., entienden Java 8 Time API sin ninguna conversación.
fuente
tl; dr
El proyecto Joda-Time está en modo de mantenimiento, ahora suplantado por las clases java.time .
java.time.Instant
clase.LocalDateTime
java.sql.Timestamp
Capture el momento actual en UTC.
Para almacenar ese momento en la base de datos:
Para recuperar ese momento de la base de datos:
Para ajustar la hora del reloj de pared a la de una zona horaria particular.
LocalDateTime
es la clase equivocadaOtras respuestas son correctas, pero no señalan que esa
LocalDateTime
es la clase incorrecta para su propósito.Tanto en java.time como en Joda-Time , a
LocalDateTime
propósito carece de cualquier concepto de zona horaria o desplazamiento desde UTC. Como tal, no representa un momento y no es un punto en la línea de tiempo. ALocalDateTime
representa una idea aproximada sobre los momentos potenciales en un rango de aproximadamente 26-27 horas.Utilice a
LocalDateTime
para cuando la zona / desplazamiento es desconocida (no es una buena situación), o cuando la zona de desplazamiento es indeterminada. Por ejemplo, "La Navidad comienza en el primer momento del 25 de diciembre de 2018" se representaría como unLocalDateTime
.Use a
ZonedDateTime
para representar un momento en una zona horaria particular. Por ejemplo, la Navidad comienza en cualquier zona en particular, comoPacific/Auckland
oAmerica/Montreal
se representaría con unZonedDateTime
objeto.Por un momento siempre en UTC, use
Instant
.Aplicar una zona horaria. El mismo momento, el mismo punto en la línea de tiempo, pero se ve con una hora de reloj de pared diferente.
No, estrategia equivocada. Si tiene un valor de solo fecha y desea un valor de fecha y hora, debe especificar una hora del día. Esa hora del día puede no ser válida en esa fecha para una zona en particular, en cuyo caso la
ZonedDateTime
clase ajusta automáticamente la hora del día según sea necesario.Si desea que el primer momento del día sea su hora del día, deje que java.time determine ese momento. No asuma que el día comienza a las 00:00:00. Anomalías como el horario de verano (DST) significa que el día puede comenzar en otro momento como 01:00:00.
java.sql.Timestamp
es la clase equivocadaEsto
java.sql.Timestamp
forma parte de las problemáticas clases antiguas de fecha y hora que ahora son heredadas, suplantadas completamente por las clases java.time . Esa clase se utilizó para representar un momento en UTC con una resolución de nanosegundos . Ese propósito ahora se cumplejava.time.Instant
.JDBC 4.2 con
getObject
/setObject
A partir de JDBC 4.2 y posterior, su controlador JDBC puede intercambiar directamente objetos java.time con la base de datos llamando a:
PreparedStatement::setObject
ResultSet::getObject
Por ejemplo:
... y ...
Convertir legado gacy moderno
Si debe interactuar con el código antiguo que aún no se ha actualizado a java.time , convierta de un lado a otro utilizando los nuevos métodos agregados a las clases antiguas.
…y…
Sobre java.time
El marco java.time está integrado en Java 8 y versiones posteriores. Estas clases suplantar la vieja problemáticos heredados clases de fecha y hora como
java.util.Date
,Calendar
, ySimpleDateFormat
.El proyecto Joda-Time , ahora en modo de mantenimiento , aconseja la migración a las clases java.time .
Para obtener más información, consulte el Tutorial de Oracle . Y busque Stack Overflow para obtener muchos ejemplos y explicaciones. La especificación es JSR 310 .
Puede intercambiar objetos java.time directamente con su base de datos. Utilice un controlador JDBC compatible con JDBC 4.2 o posterior. No hay necesidad de cadenas, no hay necesidad de
java.sql.*
clases.¿Dónde obtener las clases java.time?
El proyecto ThreeTen-Extra extiende java.time con clases adicionales. Este proyecto es un campo de pruebas para posibles adiciones futuras a java.time. Usted puede encontrar algunas clases útiles aquí, como
Interval
,YearWeek
,YearQuarter
, y más .fuente
Dependiendo de su zona horaria, puede perder unos minutos (1650-01-01 00:00:00 se convierte en 1649-12-31 23:52:58)
Use el siguiente código para evitar eso
fuente
Desde Joda se está desvaneció, alguien podría querer convertir
LocaltDate
aLocalDateTime
en Java 8. En Java 8LocalDateTime
se dará una manera de crear unaLocalDateTime
instancia mediante unLocalDate
eLocalTime
. Mira aquí.Muestra sería,
Solo como referencia, para obtener los siguientes segundos de época se puede usar,
fuente
LocalDateTime
aquí. Esa clase carece deliberadamente de cualquier concepto de zona horaria o desplazamiento desde UTC. Por lo tanto, no sirve para nada aquí. En cambio:LocalDate.parse( “20180306” , DateTimeFormatter.BASIC_ISO_DATE ).atStartOfDay( ZoneId.of( “Africa/Tunis” ).toEpochSecond()
no asuma que el día comienza a las 00:00, no siempre es el caso.java.time.LocalDate.atStartOfDay
para obtener unZonedDateTime
. Ver ejemplos en mi respuesta . Como comenté, laLocalDateTime
clase es inútil y contraproducente en todo esto.LocalDateTime
, ¿debemos usar unZoneId
?LocalDateTime
es apropiado para el problema en cuestión aquí. A no no representan un momento. A no tiene nada que ver con una localidad o zona horaria en particular, aunque el nombre puede implicar lo contrario a primera vista: obtenga más información sobre la intención y los detalles de esta clase. La clase tiene un propósito, pero no el propósito visto en esta Pregunta.LocalDateTime
LocalDateTime
LocalDateTime
la llamada de función
asStartOfDay()
aljava.time.LocalDate
objeto devuelve unjava.time.LocalDateTime
objetofuente
Java8 +
fuente