Подтвердить что ты не робот

Does System.currentTimeMillis() возвращает время UTC?

Я хочу получить текущее время UTC в миллисекундах. Я искал google и получил несколько ответов, что System.currentTimeMillis() возвращает время UTC. но это не так. Если я сделаю следующее:

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

все три раза почти одинаковы (разница в миллисекундах из-за вызовов).

t1 = 1372060916
t2 = 1372060917
t3 = 1372060918

и на этот раз это не время UTC, это время моего часового пояса. Как я могу получить текущее время UTC в Android?

4b9b3361

Ответ 1

Все три строки, которые вы указали, укажут число миллисекунд с момента unix, которое является фиксированным моментом времени, не зависящим от вашего локального часового пояса.

Вы говорите, что "на этот раз не время UTC" - я подозреваю, что вы на самом деле неправильно поставили диагноз. Я бы предложил использовать epochconverter.com. Например, в вашем примере:

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

Мы не знаем, когда вы сгенерировали это значение, но если это не было на самом деле в 8:01 UTC, это проблема с вашими системными часами.

Ни один System.currentTimeMillis, ни значение внутри Date не зависят от часового пояса. Однако вы должны знать, что Date.toString() использует локальный часовой пояс, что заставляет многих разработчиков задуматься о том, что Date неотъемлемо связано с часовым поясом - это не так, как раз вовремя, без связанного времени зонной или даже календарной системы.

Ответ 2

Я могу подтвердить, что все три вызова могут зависеть от локального времени, учитывая эпоху, а не Date.toString() или любой другой метод. Я видел, что они зависят от локального времени на определенных устройствах под управлением Android 2.3. Я не тестировал их с другими устройствами и версиями Android. В этом случае локальное время было установлено вручную.

Единственный надежный способ получить независимое время UTC - запрашивать обновление местоположения с помощью GPS_PROVIDER. Значение getTime() местоположения, полученного из NETWORK_PROVIDER, также зависит от локального времени. Другим вариантом является ping сервер, который возвращает временную метку UTC, например.

Итак, я делаю следующее:

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