¿Cómo puedo crear una fecha local de Java 8 a partir de una época larga en milisegundos?

5 minutos de lectura

¿Como puedo crear una fecha local de Java 8 a
Vihung

Tengo una API externa que me devuelve fechas como longs, representado como milisegundos desde el comienzo de la Época.

Con la API de Java de estilo antiguo, simplemente construiría un Date de eso con

Date myDate = new Date(startDateLong)

¿Cuál es el equivalente en Java 8’s? LocalDate/LocalDateTime clases?

Estoy interesado en convertir el punto en el tiempo representado por el long a un LocalDate en mi zona horaria local actual.

  • Bueno, tienes que empezar por averiguar qué zona horaria te interesa. Un valor de “milisegundos desde la época” le brinda un instante en el tiempo… que podría referirse a diferentes fechas en diferentes zonas horarias. Tener en cuenta que java.util.Date nunca fue realmente una cita en la forma en que LocalDate es – fue un instante en el tiempo también.

    – Jon Skeet

    03 feb.

  • Consulte esta pregunta: stackoverflow.com/questions/21242110/…, que cubre la conversión de java.util.Date en LocalDate

    – hotzst

    03 feb.

  • Nota: estas preguntas y respuestas también son valiosas para aquellos que intentan convertir File.lastModified() (época milis) a LocalDate(Time).

    – Kevinarpe

    27 mar. 17 a las 09:27

  • ¿Responde esto a tu pregunta? Cómo obtener milisegundos de LocalDateTime en Java 8

    – Georgios Syngouroglou

    09 feb. 21 en 08:41

  • @GeorgeSiggouroglou Esa pregunta hace lo contrario de esta pregunta, por lo que no es un duplicado.

    – Mark Rotteveel

    09 feb. 21 en 11:13

¿Como puedo crear una fecha local de Java 8 a
Holger

Si tiene los milisegundos desde la Época y quiere convertirlos a una fecha local usando la zona horaria local actual, puede usar

LocalDate date =
    Instant.ofEpochMilli(longValue).atZone(ZoneId.systemDefault()).toLocalDate();

pero tenga en cuenta que incluso la zona horaria predeterminada del sistema puede cambiar, por lo que la misma long El valor puede producir resultados diferentes en ejecuciones posteriores, incluso en la misma máquina.

Además, ten en cuenta que LocalDate, a diferencia de java.util.Date, realmente representa una fecha, no una fecha y hora.

De lo contrario, puede utilizar un LocalDateTime:

LocalDateTime date =
    LocalDateTime.ofInstant(Instant.ofEpochMilli(longValue), ZoneId.systemDefault());

  • +1 de mí para una explicación más detallada. Por cierto, incluso una zona que no sea del sistema puede cambiar (mediante tzupdater-tool o jdk-change) y, por lo tanto, producir resultados diferentes antes y después.

    – Meno Hochschild

    04 feb.

  • @Meno Hochschild: no me estaba centrando en las zonas horarias codificadas, sino en la comparación con las zonas horarias especificadas por el usuario, leídas de un archivo de configuración o variables de entorno, donde el programador asume naturalmente que pueden cambiar. Las zonas horarias codificadas son muy parecidas a las predeterminadas del sistema; el programador se ve tentado a pensar que nunca cambiarían…

    – Holger

    04 feb.

  • @Semidiós LocalDateTime.ofEpochSecond(…) requiere un real ZoneOffset, pero ZoneId.systemDefault() devuelve un ZoneId. A ZoneId puede asignarse a diferentes compensaciones, según el punto de tiempo al que se refiera. eso es lo que LocalDateTime.ofInstant hace por usted, convirtiendo el especificado ZoneId de acuerdo a lo provisto Instant.

    – Holger

    24 jul.

  • La época se define como UTC y, por lo tanto, debe ser independiente de la zona horaria, por lo que ZoneId siempre debe ser UTC.

    – Plex Q

    04 ene.

  • @PlexQ La zona horaria especificada no es relevante para la época, que de hecho es independiente de la zona horaria, pero para la semántica de la resultante LocalDate o LocalDateTime. Puede especificar cualquier zona horaria que desee, siempre que sea coherente con el uso posterior de estos objetos de resultado. Piense en lo que sucede cuando trata con múltiples objetos creados por diferentes métodos. Los casos de uso típicos para local date o datetimes incorporan la zona horaria predeterminada del sistema, por ejemplo LocalDateTime.now()LocalDateTime.ofInstant(Instant.ofEpochMilli(System.currentTimeMillis()), ZoneId.systemDefault())

    – Holger

    07 ene.

Puedes empezar con Instant.ofEpochMilli(largo):

LocalDate date =
  Instant.ofEpochMilli(startDateLong)
  .atZone(ZoneId.systemDefault())
  .toLocalDate();

  • +1 por ser explícito sobre la zona horaria. Si se omite, la zona horaria predeterminada actual de la JVM se aplica implícitamente para determinar la fecha. Para cualquier momento dado, la fecha varía en todo el mundo según la zona horaria, ya que un nuevo día amanece antes en el este.

    – Basil Bourque

    03 feb.


Creo que tengo una mejor respuesta.

new Timestamp(longEpochTime).toLocalDateTime();

  • nueva marca de tiempo(ts).toLocalDateTime().toLocalDate()

    – Stepán Yakovenko

    27 dic. 18 a las 21:59

  • Quiero decir, si no te importa importar javal.sql.Timestamp, que, dada la naturaleza monolítica de Java, supongo que está bien porque es parte de la JVM… pero huele un poco mal, pero aún así me gusta más como la época reconocida es fundamentalmente en UTC.

    – Plex Q

    04 ene.

  • El Timestamp La clase está mal diseñada y está obsoleta desde hace mucho tiempo. Su código utilizará la configuración de zona horaria de la JVM, pero dado que esta configuración puede ser modificada por otra parte de su programa u otro programa que se ejecute en la misma JVM, no podemos estar seguros de qué se trata.

    – Olé VV

    10 sep.

  • Siempre es mejor ser explícito sobre qué zona horaria se usa. El uso del antiguo java.sql.Timestamp tiene el inconveniente de que la zona horaria del sistema se aplica implícitamente, lo que suele generar confusión entre los desarrolladores.

    – Ruslán

    26 sep.

Zonas horarias y cosas aparte, una alternativa muy simple a new Date(startDateLong) podría ser LocalDate.ofEpochDay(startDateLong / 86400000L)

1642359669 636 ¿Como puedo crear una fecha local de Java 8 a
Santhosh Hirekerur

reemplace now.getTime() con su valor largo.

//GET UTC time for current date
        Date now= new Date();
        //LocalDateTime utcDateTimeForCurrentDateTime = Instant.ofEpochMilli(now.getTime()).atZone(ZoneId.of("UTC")).toLocalDateTime();
        LocalDate localDate = Instant.ofEpochMilli(now.getTime()).atZone(ZoneId.of("UTC")).toLocalDate();
        DateTimeFormatter dTF2 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
        System.out.println(" formats as " + dTF2.format(utcDateTimeForCurrentDateTime));

¿Como puedo crear una fecha local de Java 8 a
M. Prójorov

En un caso específico en el que su marca de tiempo de segundos de época proviene de SQL o está relacionada con SQL de alguna manera, puede obtenerla de esta manera:

long startDateLong = <...>

LocalDate theDate = new java.sql.Date(startDateLong).toLocalDate();

.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad