it-swarm.com.de

gibt System.currentTimeMillis () die UTC-Zeit zurück?

Ich möchte die aktuelle UTC-Zeit in Millis erhalten. Ich suchte bei Google und bekam einige Antworten, dass System.currentTimeMillis () die UTC-Zeit zurückgibt. aber das tut es nicht. Wenn ich folge:

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

alle drei Zeiten sind fast gleich (Differenz in Millisekunden aufgrund von Anrufen).

t1 = 1372060916
t2 = 1372060917
t3 = 1372060918

und diese Zeit ist nicht die UTC-Zeit, sondern meine Zeitzone. Wie kann ich die aktuelle UTC-Zeit in Android erhalten?

74
g.revolution

Alle drei von Ihnen angezeigten Zeilen geben die Anzahl der Millisekunden seit der Unix-Epoche an, bei der es sich um einen festen Zeitpunkt handelt, der von Ihrer lokalen Zeitzone nicht beeinflusst wird.

Sie sagen, "diese Zeit ist nicht die UTC-Zeit" - ich vermute, Sie haben das tatsächlich falsch diagnostiziert. Ich würde vorschlagen, hierfür epochconverter.com zu verwenden. Zum Beispiel in Ihrem Beispiel:

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

Wir wissen nicht, wann Sie diesen Wert generiert haben, aber es sei denn, er war tatsächlich um 8:01 Uhr UTC, liegt ein Problem mit der Systemuhr vor.

Weder System.currentTimeMillis Noch der Wert innerhalb eines Date selbst werden von der Zeitzone beeinflusst. Beachten Sie jedoch, dass Date.toString() die lokale Zeitzone verwendet , was viele Entwickler in die Irre führt, dass ein Date ist inhärent mit einer Zeitzone verknüpft - nicht, es ist nur ein Augenblick ohne zugeordnete Zeitzone oder sogar ein Kalendersystem.

115
Jon Skeet

Ich kann bestätigen, dass alle drei Aufrufe könnten von der Ortszeit abhängen, unter Berücksichtigung der Epoche, nicht der Date.toString() oder einer ähnlichen Methode. Ich habe gesehen, dass sie in bestimmten Geräten, auf denen Android 2.3) ausgeführt wird, von der Ortszeit abhängen. Ich habe sie nicht mit anderen Geräten und Android) - Versionen getestet. In diesem Fall wurde die Ortszeit manuell eingestellt.

Die einzige zuverlässige Möglichkeit, eine unabhängige UTC-Zeit zu erhalten, besteht darin, eine Standortaktualisierung mit GPS_PROVIDER Anzufordern. Der getTime() -Wert eines Orts, der aus NETWORK_PROVIDER Abgerufen wurde, hängt auch von der Ortszeit ab. Eine andere Option ist das Pingen eines Servers, der beispielsweise einen UTC-Zeitstempel zurückgibt.

Also, was ich tue, ist das Folgende:

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