Obteniendo "unixtime" en Java

258

Date.getTime () devuelve milisegundos desde el 1 de enero de 1970. Unixtime es segundos desde el 1 de enero de 1970. No suelo codificar en Java, pero estoy trabajando en algunas correcciones de errores. Yo tengo:

Date now = new Date();      
Long longTime = new Long(now.getTime()/1000);
return longTime.intValue();

¿Hay una mejor manera de obtener unixtime en java?

Gary Richardson
fuente
27
Como lo has enviado a un int, has introducido el problema del año 2038 (el equivalente de Y2K para Unix). Es entonces cuando la época de Unix alcanza los 2 mil millones y pasa a negativo. La solución es pasar a Unix de 64 bits. El equivalente de Java es dejarlo como largo.
John M
1
Sí, soy consciente de eso. El código con el que está interactuando espera un int 32bit para unixtime.
Gary Richardson el
158
2038 llegará pronto.
Pacerier
¿Existe un nombre propio o estándar para currentTimeMillis? Tiendo a referirme a él en mi documentación como la versión en milisegundos del tiempo UNIX.
Tom
1
Si desea que su software para sobrevivir desbordamiento, el uso long, no int. Realmente no hay razón para usar intpara una marca de tiempo, a menos que esté usando una granularidad diferente como 1 segundo = 4 segundos, etc. O eso, u oculte su código para que las generaciones futuras no puedan ver lo incompetente que era.
bryc

Respuestas:

475

Evite la creación del objeto Fecha con System.currentTimeMillis () . Una división entre 1000 te lleva a la época de Unix.

Como se menciona en un comentario, normalmente desea un primitivo largo (minúscula-l largo) no un objeto en caja largo (mayúscula-L largo) para el tipo de variable unixTime.

long unixTime = System.currentTimeMillis() / 1000L;
John M
fuente
3
También considere el uso primitivo de largo en lugar de autoboxing a largo, a menos que desee para manejar el número como un objeto (como ponerlo en una colección), otra vez evita la creación de objetos innecesarios
brabster
9
El int 32 bits de Java coincide con las plataformas de 32 bits (y el problema del año 2038). Las plataformas de 64 bits usan un tipo de datos time_t más grande. Java esquivó esa viñeta utilizando un largo como el retorno para System.currentTimeMillis (). Si convierte a int, está reintroduciendo el problema del año 2038. Ver en.wikipedia.org/wiki/Year_2038_problem#Solutions
John M
1
Creo que está equivocado en un punto: no hay diferencia entre una "L" minúscula y una mayúscula cuando se usan en literales numéricos como este. docs.oracle.com/javase/specs/jls/se7/html/jls-3.html#jls-3.10.1
matt forsythe
55
La discusión sobre capitalización (aclarada anteriormente) fue sobre el tipo de datos. Instancia de clase primitiva "larga" frente a "java.lang.Long". Estás hablando de la letra de sufijo en el literal largo, que estoy de acuerdo en mayúsculas o minúsculas. Aunque la letra minúscula "l" se parece mucho al dígito "1", es mucho más legible usar la letra "L" mayúscula.
John M
1
Haga clic en el enlace a la documentación. El retorno se define como el número de milisegundos desde el 1/1/1970 en la zona horaria UTC. ¿Quieres zonas horarias? Mira java.util.Calendar.
John M
273

Java 8 agregó una nueva API para trabajar con fechas y horas. Con Java 8 puedes usar

import java.time.Instant
...
long unixTimestamp = Instant.now().getEpochSecond();

Instant.now()devuelve un instante que representa la hora actual del sistema. Con getEpochSecond()usted obtiene los segundos de la época (tiempo unix) del Instant.

micha
fuente
44
¿Cuál es la diferencia entre Instant.now().getEpochSecond(), new Date().getTime()ySystem.currentTimeMillis()
SohamC
2
Una diferencia es que el primero está en segundos, mientras que los dos últimos están en milisegundos. Puede haber o no otros.
super_aardvark
3
import java.time.Instantsi estás en Scala
akauppi
44
Visite este sitio también para obtener una descripción detallada ... Me gustó .. currentTimeMillis
Subroto
1
Tenga en cuenta que no puede usar este método con niveles de API de Android anteriores.
Ali Nadalizadeh