104

現在の UTC 時刻をミリ秒単位で取得したい。Google を検索したところ、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時間を取得するにはどうすればよいですか?

4

2 に答える 2

150

あなたが示した3つの行はすべて、UNIXエポックからのミリ秒数を示します。これは固定された時点であり、ローカルタイムゾーンの影響を受けません。

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

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

その値がいつ生成されたかはわかりませんが、実際に UTC の午前 8 時 1 分でない限り、システム クロックに問題があります。

System.currentTimeMillisそれ自体の値も、Dateタイム ゾーンの影響も受けません。ただし、はローカル タイム ゾーンを使用しているため、多くの開発者は が本質的にタイム ゾーンに関連付けられていると誤解されていることに注意する必要がありますDate.toString() Dateこれは、関連するタイム ゾーンやカレンダー システムがない単なる瞬間にすぎません。

于 2013-06-24T08:37:27.743 に答える
2

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

独立した UTC 時刻を取得する唯一の信頼できる方法は、GPS_PROVIDER. getTime()取得した場所の値は、NETWORK_PROVIDER現地時間にも依存します。別のオプションは、たとえば、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;
}
于 2013-11-05T14:11:07.897 に答える