java android datetime utc java.util.date

java - ¿System.currentTimeMillis() devuelve la hora UTC?



android datetime (2)

Quiero obtener la hora UTC actual en millis. Busqué en google y obtuve algunas respuestas de que System.currentTimeMillis () devuelve la hora UTC. pero no es así Si hago lo siguiente:

long t1 = System.currentTimeMillis(); long t2 = new Date().getTime(); long t3 = Calendar.getInstance().getTimeInMillis();

las tres veces son casi iguales (la diferencia es en mili segundos debido a las llamadas).

t1 = 1372060916 t2 = 1372060917 t3 = 1372060918

y esta vez no es la hora UTC sino que esta es mi hora de zona horaria. ¿Cómo puedo obtener la hora UTC actual en Android?


Las tres líneas que ha mostrado darán la cantidad de milisegundos desde la época de Unix, que es un punto fijo en el tiempo, no afectado por su zona horaria local.

Usted dice "esta vez no es la hora UTC" - Sospecho que realmente ha diagnosticado eso incorrectamente. Sugeriría usar epochconverter.com para esto. Por ejemplo, en tu ejemplo:

1372060916 = Mon, 24 Jun 2013 08:01:56 GMT

No sabemos cuándo generó ese valor, pero a menos que fuera realmente a las 8:01 a.m. UTC, es un problema con el reloj de su sistema.

Ni System.currentTimeMillis ni el valor dentro de una misma Date se ven afectados por la zona horaria. Sin embargo, debe tener en cuenta que Date.toString() utiliza el huso horario local, lo que induce a muchos desarrolladores a pensar que una Date está asociada inherentemente a un huso horario, no lo es, es solo un instante en el tiempo, sin un tiempo asociado. zona o incluso sistema de calendario.


Puedo confirmar que las tres llamadas podrían depender de la hora local, teniendo en cuenta la época, no la Date.toString() o cualquier método similar. Los he visto depender de la hora local en dispositivos específicos con Android 2.3. No los he probado con otros dispositivos y versiones de Android. En este caso, la hora local se configuró manualmente.

La única manera confiable de obtener un horario UTC independiente es solicitando una actualización de ubicación usando GPS_PROVIDER . El valor getTime() de una ubicación recuperada de NETWORK_PROVIDER también depende de la hora local. Otra opción es hacer ping a un servidor que devuelve una marca de tiempo UTC, por ejemplo.

Entonces, lo que hago es lo siguiente:

public static String getUTCstring(Location location) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); sdf.setTimeZone(TimeZone.getTimeZone("UTC")); String date = sdf.format(new Date(location.getTime())); // Append the string "UTC" to the date if(!date.contains("UTC")) { date += " UTC"; } return date; }