Tuve un problema algo similar aquí: stackoverflow.com/a/23197731/1856960 . Respuesta corta, en realidad no. Pero eso no es necesariamente algo malo.
jacobhyphenated
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.
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.
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
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.
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.
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:
Respuestas:
Tu puedes hacer:
fuente
timestamp.toLocalDateTime()
método usará la zona horaria predeterminada del sistema para realizar la conversión. Esto puede o no ser lo que quieres.LocalDateTime
siempre usa la zona horaria predeterminada del sistema. Eso es lo que significa "local" en su nombre.La respuesta aceptada no es ideal, así que decidí agregar mis 2 centavos
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
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
fuente
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:
O puede usar la cadena toInstant.atZone:
fuente