¿Cómo convertir java.sql.timestamp a LocalDate (java8) java.time?


Respuestas:


196

Tu puedes hacer:

timeStamp.toLocalDateTime().toLocalDate();

Tenga en cuenta que timestamp.toLocalDateTime() usará la Clock.systemDefaultZone()zona horaria para realizar la conversión. Esto puede o no ser lo que quieres.


1
Se ha agregado en Java 8.
assylias

54
Solo una nota, el timestamp.toLocalDateTime()método usará la zona horaria predeterminada del sistema para realizar la conversión. Esto puede o no ser lo que quieres.
jacobhyphenated

1
@jacobhyphenated, publique la respuesta utilizando la zona horaria explícita. ¡Gracias!
user482745

El comentario de @jacobhyphenated es extremadamente importante aquí, de ahí la cantidad de votos a favor. Vea mi respuesta para más detalles stackoverflow.com/a/57101544/2032701
Ruslan

@jacobhyphenated, LocalDateTimesiempre usa la zona horaria predeterminada del sistema. Eso es lo que significa "local" en su nombre.
M. Prokhorov

20

La respuesta aceptada no es ideal, así que decidí agregar mis 2 centavos

timeStamp.toLocalDateTime().toLocalDate();

es una mala solución en general , ni siquiera estoy seguro de por qué agregaron este método al JDK ya que hace que las cosas sean realmente confusas al hacer una conversión implícita utilizando la zona horaria del sistema. Por lo general, cuando se usan solo clases de fecha java8, el programador se ve obligado a especificar una zona horaria que es algo bueno.

La buena solución es

timestamp.toInstant().atZone(zoneId).toLocalDate()

Donde zoneId es la zona horaria que desea usar, que generalmente es ZoneId.systemDefault () si desea usar la zona horaria de su sistema o alguna zona horaria codificada como ZoneOffset.UTC

El enfoque general debe ser

  1. Libérese de las nuevas clases de fecha java8 utilizando una clase que esté directamente relacionada, por ejemplo, en nuestro caso java.time.Instant está directamente relacionado con java.sql.Timestamp , es decir, no se necesitan conversiones de zona horaria entre ellas.
  2. Utilice los métodos bien diseñados en esta clase java8 para hacer lo correcto. En nuestro caso, atZone (zoneId) hizo explícito que estamos haciendo una conversión y que estamos usando una zona horaria particular para ello.

1
Estoy en desacuerdo. La marca de tiempo (y también la Fecha) no tienen ninguna información de zona. LocalDate no tiene ninguna información de zona, por lo que los dos son equivalentes. La conversión entre ellos se puede hacer independientemente de cualquier zona en particular. La conversión a ZonedDateTime antes de convertir a LocalDate agrega una zona horaria y luego la quita nuevamente; es mucho más probable que obtenga un error desagradable, difícil de encontrar, al hacerlo de esa manera.
AutomatedMike

55
@AutomatedMike Timestamp (y también Date) representan un punto en el tiempo en UTC. LocalDate no representa un punto en el tiempo, sino un tiempo como se ve en un reloj de pared. Por favor lea sus javadocs. "La conversión entre ellos se puede hacer independientemente de cualquier zona en particular" - no es cierto , la nueva marca de tiempo (0L) .toLocalDateTime () devuelve "1970-01-01T03: 00" para mi zona horaria de Moscú. El resultado puede ser diferente para su zona horaria.
Ruslan

1
@AutomatedMike Incluso si elimina el tiempo haciendo toLocalDate (), es fácil demostrar que el día puede estar equivocado si Timestamp tuvo una hora alrededor de la medianoche, por ejemplo, nuevo Timestamp (1000 * 60 * 60 * 23) .toLocalDateTime (). ToLocalDate () devuelve "1970-01-02" para mi zona horaria de Moscú cuando es "1970-01-01" en UTC.
Ruslan

1
@AutomatedMike "agrega una zona horaria y luego la quita de nuevo": el punto no es agregar y eliminar una zona horaria, sino convertir entre diferentes nociones utilizando una zona horaria explícita . Esto está en contraste con los ejemplos de mis dos comentarios anteriores donde una zona horaria se aplica implícitamente .
Ruslan

7

Expandiré ligeramente la respuesta de @assylias para tener en cuenta la zona horaria. Hay al menos dos formas de obtener LocalDateTime para una zona horaria específica.

Puede usar la zona horaria setDefault para toda la aplicación. Debe llamarse antes de cualquier marca de tiempo -> conversión java.time:

public static void main(String... args) {
    TimeZone utcTimeZone = TimeZone.getTimeZone("UTC");
    TimeZone.setDefault(utcTimeZone);
    ...
    timestamp.toLocalDateTime().toLocalDate();
}

O puede usar la cadena toInstant.atZone:

timestamp.toInstant()
        .atZone(ZoneId.of("UTC"))
        .toLocalDate();
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.