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?

Solutions Collecting From Web of "Does System.currentTimeMillis () возвращает время UTC?"

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

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

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

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

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

Я могу подтвердить, что все три вызова могут зависеть от местного времени, учитывая эпоху, а не 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; }