Solución:
JodaTime
Para convertir JodaTime’s org.joda.time.LocalDate
para java.sql.Timestamp
, solo haz
Timestamp timestamp = new Timestamp(localDate.toDateTimeAtStartOfDay().getMillis());
Para convertir JodaTime’s org.joda.time.LocalDateTime
para java.sql.Timestamp
, solo haz
Timestamp timestamp = new Timestamp(localDateTime.toDateTime().getMillis());
JavaTime
Para convertir Java8 java.time.LocalDate
para java.sql.Timestamp
, solo haz
Timestamp timestamp = Timestamp.valueOf(localDate.atStartOfDay());
Para convertir Java8 java.time.LocalDateTime
para java.sql.Timestamp
, solo haz
Timestamp timestamp = Timestamp.valueOf(localDateTime);
La mejor manera de usar la API de tiempo de Java 8:
LocalDateTime ldt = timeStamp.toLocalDateTime();
Timestamp ts = Timestamp.valueOf(ldt);
Para usar con JPA instalado con su modelo (https://weblogs.java.net/blog/montanajava/archive/2014/06/17/using-java-8-datetime-classes-jpa):
@Converter(autoApply = true)
public class LocalDateTimeConverter implements AttributeConverter<LocalDateTime, Timestamp> {
@Override
public Timestamp convertToDatabaseColumn(LocalDateTime ldt) {
return Timestamp.valueOf(ldt);
}
@Override
public LocalDateTime convertToEntityAttribute(Timestamp ts) {
return ts.toLocalDateTime();
}
}
Así que ahora es un tiempo relativo independiente de la zona horaria. Además, es fácil de hacer:
LocalDate ld = ldt.toLocalDate();
LocalTime lt = ldt.toLocalTime();
Formateo:
DateTimeFormatter DATE_TME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm")
String str = ldt.format(DATE_TME_FORMATTER);
ldt = LocalDateTime.parse(str, DATE_TME_FORMATTER);
ACTUALIZACIÓN: postgres 9.4.1208, HSQLDB 2.4.0, etc., ¡entienden la API de Java 8 Time sin ninguna conversación!
tl; dr
los Joda-Time El proyecto está en modo de mantenimiento, ahora reemplazado por java.time clases.
-
Solo usa
java.time.Instant
clase. - No es necesario:
LocalDateTime
java.sql.Timestamp
- Instrumentos de cuerda
Captura el momento actual en UTC.
Instant.now()
Para almacenar ese momento en la base de datos:
myPreparedStatement.setObject( … , Instant.now() ) // Writes an `Instant` to database.
Para recuperar ese momento de la base de datos:
myResultSet.getObject( … , Instant.class ) // Instantiates a `Instant`
Para ajustar la hora del reloj de pared a la de una zona horaria en particular.
instant.atZone( z ) // Instantiates a `ZonedDateTime`
LocalDateTime
es la clase equivocada
Otras respuestas son correctas, pero no señalan que LocalDateTime
es la clase incorrecta para su propósito.
En ambos java.time y Joda-Time, a LocalDateTime
intencionalmente carece de cualquier concepto de zona horaria o desplazamiento de UTC. Como tal, lo hace no representan un momento, y es no un punto en la línea de tiempo. A LocalDateTime
representa una idea aproximada sobre potencial momentos a lo largo de un rango de aproximadamente 26-27 horas.
Utilizar una LocalDateTime
para cuando la zona / compensación es desconocida (no es una buena situación), o cuando la compensación de zona es indeterminada. Por ejemplo, “La Navidad comienza en el primer momento del 25 de diciembre de 2018” se representaría como LocalDateTime
.
Utilizar una ZonedDateTime
para representar un momento en una zona horaria particular. Por ejemplo, la Navidad comienza en cualquier zona en particular, como Pacific/Auckland
o America/Montreal
estaría representado con un ZonedDateTime
objeto.
Por un momento siempre en UTC, use Instant
.
Instant instant = Instant.now() ; // Capture the current moment in UTC.
Aplicar una zona horaria. Mismo momento, mismo punto en la línea de tiempo, pero visto con una hora de reloj de pared diferente.
ZoneId z = ZoneId.of( "Africa/Tunis" ) ;
ZonedDateTime zdt = instant.atZone( z ) ; // Same moment, different wall-clock time.
Entonces, si puedo convertir entre LocalDate y LocalDateTime,
No, estrategia incorrecta. 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 ZonedDateTime
la clase ajusta automáticamente la hora del día según sea necesario.
LocalDate ld = LocalDate.of( 2018 , Month.JANUARY , 23 ) ;
LocalTime lt = LocalTime.of( 14 , 0 ) ; // 14:00 = 2 PM.
ZonedDateTime zdt = ZonedDateTime.of( ld , lt , z ) ;
Si desea que el primer momento del día sea su hora del día, deje java.time determinar ese momento. No asuma que el día comienza a las 00:00:00. Anomalías como el horario de verano (DST) significan que el día puede comenzar a otra hora, como la 01:00:00.
ZonedDateTime zdt = ld.atStartOfDay( z ) ;
java.sql.Timestamp
es la clase equivocada
los java.sql.Timestamp
es parte de las viejas y problemáticas clases de fecha y hora que ahora son heredadas, suplantadas por completo por java.time clases. Esa clase se utilizó para representar un momento en UTC con una resolución de nanosegundos. Ese propósito ahora se cumple con java.time.Instant
.
JDBC 4.2 con getObject
/setObject
A partir de JDBC 4.2 y posteriores, su controlador JDBC puede intercambiar directamente objetos java.time con la base de datos llamando a:
PreparedStatement::setObject
ResultSet::getObject
Por ejemplo:
myPreparedStatement.setObject( … , instant ) ;
… y …
Instant instant = myResultSet.getObject( … , Instant.class ) ;
Convertir legado ⬌ moderno
Si debe interactuar con un código antiguo que aún no se ha actualizado a java.time, convierta hacia adelante y hacia atrás usando nuevos métodos agregados a las clases antiguas.
Instant instant = myJavaSqlTimestamp.toInstant() ; // Going from legacy class to modern class.
…y…
java.sql.Timestamp myJavaSqlTimestamp = java.sql.Timestamp.from( instant ) ; // Going from modern class to legacy class.
Sobre java.time
los java.time framework está integrado en Java 8 y versiones posteriores. Estas clases suplantan las antiguas y problemáticas clases de fecha y hora heredadas, como java.util.Date
, Calendar
Y SimpleDateFormat
.
los Joda-Time proyecto, 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.
Puedes intercambiar java.time objetos directamente con su base de datos. Utilice un controlador JDBC compatible con JDBC 4.2 o posterior. Sin necesidad de cuerdas, sin necesidad de java.sql.*
clases.
¿Dónde obtener las clases java.time?
-
Java SE 8, Java SE 9, y después
- Incorporado.
- Parte de la API estándar de Java con una implementación integrada.
- Java 9 agrega algunas funciones y correcciones menores.
-
Java SE 6 y Java SE 7
- Gran parte de la funcionalidad de java.time está retroportada a Java 6 y 7 en ThreeTen-Backport.
-
Androide
- Versiones posteriores de implementaciones de paquetes de Android de las clases java.time.
- Para Android anterior (<26), el ThreeTenABP el proyecto se adapta ThreeTen-Backport (mencionado anteriormente). Ver Cómo usar ThreeTenABP….
los ThreeTen-Extra el proyecto extiende java.time con clases adicionales. Este proyecto es un campo de pruebas para posibles adiciones futuras a java.time. Puede encontrar algunas clases útiles aquí, como Interval
, YearWeek
, YearQuarter
, y más.