web-dev-qa-db-ja.com

System.currentTimeMillis()はUTC時間を返しますか?

現在のUTC時間をミリ秒単位で取得したい。私はグーグルを検索し、System.currentTimeMillis()がUTC時間を返すという回答を得ました。しかし、そうではありません。次の場合:

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

3つの時間はすべてほぼ同じです(呼び出しによる差はミリ秒単位です)。

t1 = 1372060916
t2 = 1372060917
t3 = 1372060918

この時間はUTC時間ではなく、これは私のタイムゾーン時間です。 Androidで現在のUTC時間を取得するにはどうすればよいですか?

74
g.revolution

表示した3行はすべて、Unixエポック以降のミリ秒数を示します。これは固定時間であり、ローカルタイムゾーンの影響を受けません。

あなたは「この時間はUTC時間ではありません」と言う-あなたは実際にそれを間違って診断したと思う。これには epochconverter.com を使用することをお勧めします。たとえば、あなたの例では:

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

その値をいつ生成したかはわかりませんが、UTC 8:01 amに実際にでない限り、システムクロックに問題があります。

System.currentTimeMillisDate自体の値も、タイムゾーンの影響を受けません。ただし、Date.toString()doesはローカルタイムゾーンを使用するため、多くの開発者がDate本質的にタイムゾーンに関連付けられています-それは、タイムゾーンやカレンダーシステムさえ関連付けられていない、ただの瞬間です。

115
Jon Skeet

Date.toString()または同様の方法ではなく、エポックを考慮して、3つの呼び出しすべてcouldがローカル時間に依存していることを確認できます。 Android 2.3を実行している特定のデバイスのローカル時間に依存するのを見てきました。他のデバイスやAndroidバージョンではテストしていません。この場合、現地時間は手動で設定されました。

独立したUTC時間を取得する唯一の信頼できる方法は、GPS_PROVIDERを使用して位置の更新を要求することです。 NETWORK_PROVIDERから取得した場所のgetTime()値も現地時間に依存します。別のオプションは、たとえば、UTCタイムスタンプを返すサーバーへのpingです。

だから、私がやっていることは次のとおりです:

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