Desejo obter a hora UTC atual em milissegundos. Eu pesquisei no google e encontrei algumas respostas que System.currentTimeMillis () retorna a hora UTC. mas isso não acontece. Se eu fizer o seguinte:
long t1 = System.currentTimeMillis();
long t2 = new Date().getTime();
long t3 = Calendar.getInstance().getTimeInMillis();
todas as três vezes são quase iguais (a diferença é em milissegundos devido às chamadas).
t1 = 1372060916
t2 = 1372060917
t3 = 1372060918
e esta hora não é a hora UTC, em vez disso, é o meu fuso horário. Como posso obter a hora UTC atual no android?
Respostas:
Todas as três linhas que você mostrou darão o número de milissegundos desde a época do unix, que é um ponto fixo no tempo, não afetado pelo seu fuso horário local.
Você diz "esta hora não é a hora UTC" - eu suspeito que você realmente diagnosticou isso incorretamente. Eu sugeriria usar epochconverter.com para isso. Por exemplo, em seu exemplo:
Não sabemos quando você gerou esse valor, mas a menos que seja realmente às 8:01 UTC, é um problema com o relógio do sistema.
Nem,
System.currentTimeMillis
nem o valor dentro deDate
si são afetados pelo fuso horário. No entanto, você deve estar ciente de queDate.toString()
não usar o fuso horário local, que engana muitos desenvolvedores em pensar que umaDate
está intrinsecamente associada uma zona de tempo - não é, é apenas um instante no tempo, sem um fuso horário associado ou sistema de calendário mesmo.fonte
Date.getTime()
para encontrar o tempo em milissegundos desde a época do Unix, divida por 1000 (já que o nome do arquivo está em segundos desde a época do Unix) e apenas formate esse inteiro como uma string.Posso confirmar que todas as três chamadas podem depender da hora local, considerando a época, e não o
Date.toString()
ou qualquer método semelhante. Já vi que dependem da hora local em dispositivos específicos que executam o Android 2.3. Não os testei com outros dispositivos e versões do Android. Neste caso, a hora local foi acertada manualmente.A única maneira confiável de obter uma hora UTC independente é solicitando uma atualização de local usando o
GPS_PROVIDER
. OgetTime()
valor de um local recuperadoNETWORK_PROVIDER
também depende da hora local. Outra opção é fazer ping em um servidor que retorna um carimbo de data / hora UTC, por exemplo.Então, o que eu faço é o seguinte:
fonte