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?
Ответы
Ответ 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;
}