Я хочу получить текущее время 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?
Ответы:
Все три строки, которые вы показали, дадут количество миллисекунд с эпохи unix, которая является фиксированной точкой во времени, не зависящей от вашего местного часового пояса.
Вы говорите: «Это время не по Гринвичу» - я подозреваю, что вы на самом деле неправильно это диагностировали. Я бы посоветовал использовать для этого epochconverter.com . Например, в вашем примере:
1372060916 = Mon, 24 Jun 2013 08:01:56 GMT
Мы не знаем, когда вы сгенерировали это значение, но если это не произошло на самом деле в 8:01 по всемирному координированному времени, это проблема с вашими системными часами.
Ни ,
System.currentTimeMillis
ни стоимость вDate
себе страдают от временной зоны. Однако вы должны знать, чтоDate.toString()
он использует местный часовой пояс, что вводит в заблуждение многих разработчиков, заставляя думать, что aDate
по своей сути связано с часовым поясом - это не так, это просто момент времени, без соответствующего часового пояса или даже календарной системы.источник
Date.getTime()
чтобы найти время в миллисекундах с эпохи Unix, разделите на 1000 (поскольку имя файла находится в секундах с эпохи Unix) и просто отформатируйте это целое число как строку.Я могу подтвердить, что все три звонка могли зависеть от местного времени, учитывая эпоху, а не от
Date.toString()
какого-либо подобного метода. Я видел, что они зависят от местного времени на определенных устройствах под управлением Android 2.3. Я не тестировал их с другими устройствами и версиями Android. В этом случае местное время выставлялось вручную.Единственный надежный способ получить независимое время в формате UTC - это запросить обновление местоположения с помощью
GPS_PROVIDER
. ВgetTime()
Значение местоположения , извлеченное изNETWORK_PROVIDER
также зависит от местного времени. Другой вариант - это проверить связь с сервером, который, например, возвращает метку времени в формате 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; }
источник