Saltar al contenido

Convierta LocalDate en LocalDateTime o java.sql.Timestamp

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, CalendarY 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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *