Fragmentos de timestamp Unix en Java
Ejemplos de Java para segundos epoch actuales, milisegundos, conversión con Instant, formateo con zona horaria y las APIs modernas de java.time.
import java.time.Instant;
Instant.now().getEpochSecond()System.currentTimeMillis()
// or
Instant.now().toEpochMilli()import java.time.Instant;
Instant.ofEpochSecond(1700000000)
Instant.ofEpochMilli(1700000000000L)import java.time.*;
import java.time.format.DateTimeFormatter;
Instant.ofEpochSecond(1700000000)
.atZone(ZoneOffset.UTC)
.format(DateTimeFormatter.ISO_DATE_TIME)import java.time.*;
Instant.ofEpochSecond(1700000000)
.atZone(ZoneId.of("America/New_York"))
.toString()Conceptos básicos de marcas de tiempo en Java
El código Java moderno debería preferir java.time.Instant para el trabajo con marcas de tiempo. Instant.now().getEpochSecond() da segundos Unix e Instant.now().toEpochMilli() da milisegundos Unix.
De millis de Java a marca de tiempo Unix
El código Java suele empezar con System.currentTimeMillis() — un long de milisegundos epoch. Para una marca de tiempo Unix estándar en segundos, divide entre 1000. Para una fecha, construye un Instant. Usa las conversiones explícitas de abajo en lugar de pasar el long por distintas API que podrían esperar una u otra unidad.
- long millis = System.currentTimeMillis(); // 13 digits, epoch ms
- long secs = System.currentTimeMillis() / 1000L; // millis to Unix timestamp
- Instant inst = Instant.ofEpochMilli(millis); // currentTimeMillis to date (Instant)
- String iso = Instant.ofEpochMilli(millis).toString(); // ISO 8601 UTC
- ZonedDateTime zdt = Instant.ofEpochMilli(millis).atZone(ZoneId.of("UTC"));
- Usa System.nanoTime() solo para mediciones de tiempo transcurrido — no se basa en epoch
Formateo en Java con zona horaria
Convierte un Instant en un ZonedDateTime con ZoneId al mostrar la hora local. Mantén el almacenamiento y las comparaciones en Instant o UTC, y formatea solo en el borde de la aplicación.
Notas de producción para Java
La API java.time separa los instantes, los valores de calendario locales y la visualización con zona horaria. Usa Instant para el momento que se debe almacenar o comparar. Usa ZonedDateTime solo después de seleccionar una ZoneId para un usuario, inquilino o informe. Evita los antiguos Date y Calendar salvo que una biblioteca más antigua los requiera.
- Usa Instant.now().getEpochSecond() para segundos Unix
- Usa Instant.now().toEpochMilli() o System.currentTimeMillis() para milisegundos
- Usa Instant.ofEpochSecond(seconds) al recibir marcas de tiempo Unix estándar
- Usa DateTimeFormatter.ISO_INSTANT para salida de API UTC compacta
FAQ
- ¿El código nuevo debería usar Date o Instant?
- Usa Instant para almacenar y comparar marcas de tiempo. El antiguo Date puede seguir apareciendo en bibliotecas viejas, pero java.time es más claro para segundos, milisegundos y formato con zona horaria.
- ¿Cuál es la diferencia entre Instant y ZonedDateTime?
- Instant es el momento exacto en UTC. ZonedDateTime es ese momento mostrado con un ZoneId, lo cual es útil para fechas e informes de cara al usuario.
- ¿Cómo verifico los valores epoch en Java?
- Imprime Instant.ofEpochSecond(seconds) o Instant.ofEpochMilli(milliseconds) antes de guardar un valor. La salida ISO debería coincidir con el instante UTC esperado por el sistema receptor.
- ¿Cómo convierto millis a una marca de tiempo Unix en Java?
- Divide System.currentTimeMillis() entre 1000L para obtener un long de segundos Unix: long secs = System.currentTimeMillis() / 1000L. Usa Instant.ofEpochSecond(secs) para volver a un Instant.
- ¿Cómo convierto currentTimeMillis a una fecha en Java?
- Envuélvelo en un Instant: Instant.ofEpochMilli(System.currentTimeMillis()). Para mostrarlo, combínalo con un ZoneId: ZonedDateTime.ofInstant(instant, ZoneId.of("UTC")) o cualquier otra zona IANA.