web-dev-qa-db-fra.com

System.currentTimeMillis () renvoie-t-il l'heure UTC?

Je veux obtenir l'heure UTC actuelle en millis. J'ai cherché sur Google et obtenu quelques réponses que System.currentTimeMillis () renvoie l'heure UTC. mais ce n'est pas le cas. Si je fais ce qui suit:

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

les trois fois sont presque identiques (la différence est exprimée en millisecondes en raison des appels).

t1 = 1372060916
t2 = 1372060917
t3 = 1372060918

et cette heure n’est pas l’heure UTC mais bien l’heure de mon fuseau horaire. Comment puis-je obtenir l'heure UTC actuelle dans Android?

74
g.revolution

Les trois lignes que vous avez indiquées donneront le nombre de millisecondes depuis l’époque unix, qui est un point fixe dans le temps et qui n’est pas affecté par votre fuseau horaire local.

Vous dites que "cette fois, ce n'est pas l'heure UTC" - je suppose que vous avez effectivement diagnostiqué cela à tort. Je suggérerais d'utiliser epochconverter.com pour cela. Par exemple, dans votre exemple:

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

Nous ne savons pas quand vous avez généré cette valeur, mais à moins que ce ne soit en réalité à 08h01 du matin, il s'agit d'un problème d'horloge système.

Ni System.currentTimeMillis Ni la valeur dans un Date lui-même ne sont affectés par le fuseau horaire. Cependant, vous devez savoir que Date.toString() utilise le fuseau horaire local, ce qui induit en erreur de nombreux développeurs à penser qu'un Date est intrinsèquement associé à un fuseau horaire - ce n'est pas, c'est juste un instant dans le temps, sans fuseau horaire ni même système de calendrier.

115
Jon Skeet

Je peux confirmer que les trois appels pourraient dépendent de l'heure locale, en tenant compte de l'époque, pas de la Date.toString() ou de toute autre méthode similaire. Je les ai vus dépendent de l'heure locale de certains appareils fonctionnant sous Android 2.3. Je ne les ai pas testés avec d'autres appareils et Android. Dans ce cas , l’heure locale a été réglée manuellement.

Le seul moyen fiable d'obtenir une heure UTC indépendante consiste à demander une mise à jour d'emplacement à l'aide de GPS_PROVIDER. La valeur getTime() d'un emplacement extrait de NETWORK_PROVIDER Dépend également de l'heure locale. Une autre option consiste à envoyer une requête ping à un serveur qui renvoie un horodatage UTC, par exemple.

Donc, ce que je fais est le suivant:

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;
}
2
jlhonora