System.currentTimeMillis()返回UTC时间?

我想以毫秒为单位获得当前的UTC时间。 我search谷歌,得到一些答案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时期以来的毫秒数,这是一个固定的时间点,不受当地时区的影响。

你说“这次不是UTC时间” – 我怀疑你实际上诊断错误。 我会build议使用epochconverter.com 。 例如,在你的例子中:

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

我们不知道什么时候产生了这个值,但除非实际上是UTC时间上午8:01,否则这是系统时钟的问题。

System.currentTimeMillisDate的值都不受时区的影响。 但是,您应该意识到Date.toString() 确实使用了本地时区,它误导了许多开发人员认为Date与时区固有关联 – 不是,只是一个瞬间,没有关联的时间区域甚至日历系统。

我可以确认,所有三个调用可能取决于当地时间,考虑到时代,而不是Date.toString()或任何类似的方法。 我已经看到他们依靠当地时间在运行Android 2.3的特定设备。 我没有testing过其他设备和Android版本。 在这种情况下,本地时间是手动设置的。

获得独立UTC时间的唯一可靠方法是使用GPS_PROVIDER请求位置更新。 从NETWORK_PROVIDER检索的位置的getTime()值也取决于本地时间。 另一种select是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; }