Tengo una cadena que contiene la época de UNIX Epoch y necesito convertirla en un objeto Java Date.
String date = "1081157732";
DateFormat df = new SimpleDateFormat(""); // This line
try {
Date expiry = df.parse(date);
} catch (ParseException ex) {
ex.getStackTrace();
}
La línea marcada es donde tengo problemas. No puedo averiguar cuál debería ser el argumento para SimpleDateFormat (), o incluso si debería usar SimpleDateFormat ().
private String getDateString(long timeInMilliseconds) { SimpleDateFormat formatter = new SimpleDateFormat("EEE, d MMM yyyy 'at' HH:mm:ss z"); return formatter.format(timeInMilliseconds); }
Respuestas:
¿Qué tal solo:
Date expiry = new Date(Long.parseLong(date));
EDITAR: según la respuesta de rde6173 y observando más de cerca la entrada especificada en la pregunta, "1081157732" parece ser un valor de época basado en segundos, por lo que debería multiplicar el largo de parseLong () por 1000 para convertir a milisegundos, que es lo que usa el constructor Date de Java, entonces:
Date expiry = new Date(Long.parseLong(date) * 1000);
fuente
java.util.Date
,java.util.Calendar
yjava.text.SimpleDateFormat
ahora son heredadas , suplantadas por las clases java.time integradas en Java 8 y versiones posteriores. Consulte el tutorial de Oracle .Época es el número de segundos desde el 1 de enero de 1970 ..
Entonces:
String epochString = "1081157732"; long epoch = Long.parseLong( epochString ); Date expiry = new Date( epoch * 1000 );
Para obtener más información: http://www.epochconverter.com/
fuente
java.time
Usando el
java.time
marco integrado en Java 8 y versiones posteriores.import java.time.LocalDateTime; import java.time.Instant; import java.time.ZoneId; long epoch = Long.parseLong("1081157732"); Instant instant = Instant.ofEpochSecond(epoch); ZonedDateTime.ofInstant(instant, ZoneOffset.UTC); # ZonedDateTime = 2004-04-05T09:35:32Z[UTC]
En este caso, es mejor usar
ZonedDateTime
para marcarlo como fecha en la zona horaria UTC porque Epoch se define en UTC en la hora Unix utilizada por Java.ZoneOffset
contiene una útil constante para la zona horaria UTC, como se ve en la última línea de arriba. Su superclaseZoneId
se puede utilizar para adaptarse a otras zonas horarias.ZoneId zoneId = ZoneId.of( "America/Montreal" );
fuente
LocalDateTime
y solo mostrar unZonedDateTime
. En la mayoría de las aplicaciones comerciales,ZonedDateTime
es la mejor manera de hacerlo. Las personas tienden a meterse en problemas / confusión con losLocalXXX
tipos.long timestamp = Long.parseLong(date) Date expiry = new Date(timestamp * 1000)
fuente
Mejor aún, use JodaTime . Es mucho más fácil analizar cadenas y convertirlas en cadenas. También es seguro para subprocesos. Vale la pena el tiempo que le llevará implementarlo.
fuente
Para convertir la marca de tiempo de segundos en marca de tiempo de milisegundos. Podrías usar la API TimeUnit y hacerlo así.
long milliSecondTimeStamp = MILLISECONDS.convert(secondsTimeStamp, SECONDS)
fuente
Hum ... si no me equivoco, la época de UNIX es en realidad lo mismo que
Entonces escribiendo
try { Date expiry = new Date(Long.parseLong(date)); } catch(NumberFormatException e) { // ... }
debería funcionar (y ser mucho más rápido que el análisis de la fecha)
fuente