Quiero obtener la hora UTC actual en milisegundos. Busqué en Google y obtuve algunas respuestas 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();
los tres tiempos son casi iguales (la diferencia está en milisegundos debido a las llamadas).
t1 = 1372060916
t2 = 1372060917
t3 = 1372060918
y esta hora no es la hora UTC, sino que es la hora de mi zona horaria. ¿Cómo puedo obtener la hora UTC actual en Android?
Respuestas:
Las tres líneas que ha mostrado le 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.
Dices "esta hora no es la hora UTC". Sospecho que lo has diagnosticado incorrectamente. Sugeriría usar epochconverter.com para esto. Por ejemplo, en su ejemplo:
No sabemos cuando generó ese valor, pero a menos que fuera realmente a las 8:01 am GMT, se trata de un problema con el reloj del sistema.
Ni
System.currentTimeMillis
el valor dentro de aDate
sí mismo se ven afectados por la zona horaria. Sin embargo, debe tener en cuenta queDate.toString()
sí usa la zona horaria local, lo que induce a error a muchos desarrolladores a pensar que unaDate
está intrínsecamente asociada con una zona horaria; no lo es, es solo un instante en el tiempo, sin una zona horaria asociada o incluso un sistema de calendario.fuente
Date.getTime()
para encontrar el tiempo de milisegundos desde la época de Unix, divida por 1000 (ya que ese nombre de archivo está en segundos desde la época de Unix) y simplemente formatee ese número entero como una cadena.Puedo confirmar que las tres llamadas podrían depender de la hora local, considerando la época, no el
Date.toString()
o cualquier método similar. Los he visto depender de la hora local en dispositivos específicos que ejecutan Android 2.3. No los he probado con otros dispositivos y versiones de Android. En este caso, la hora local se estableció manualmente.La única forma confiable de obtener una hora UTC independiente es solicitando una actualización de ubicación utilizando
GPS_PROVIDER
. ElgetTime()
valor de una ubicación recuperadaNETWORK_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:
fuente