[英]does System.currentTimeMillis() return UTC time?
我想以毫秒为单位获取当前的 UTC 时间。 我搜索了谷歌并得到了一些 System.currentTimeMillis() 确实返回 UTC 时间的答案。 但事实并非如此。 如果我执行以下操作:
long t1 = System.currentTimeMillis();
long t2 = new Date().getTime();
long t3 = Calendar.getInstance().getTimeInMillis();
所有三个时间几乎相同(由于调用而差异以毫秒为单位)。
t1 = 1372060916
t2 = 1372060917
t3 = 1372060918
这次不是UTC时间,而是我的时区时间。 如何在android中获取当前的UTC时间?
您显示的所有三行都将给出自 unix 纪元以来的毫秒数,这是一个固定的时间点,不受本地时区的影响。
您说“这次不是 UTC 时间”-我怀疑您实际上诊断错误了。 我建议为此使用epochconverter.com 。 例如,在您的示例中:
1372060916 = Mon, 24 Jun 2013 08:01:56 GMT
我们不知道您何时生成该值,但除非它实际上是在 8:01 am UTC,否则这是您的系统时钟的问题。
System.currentTimeMillis
和Date
本身中的值都不受时区影响。 但是,您应该知道Date.toString()
确实使用了本地时区,这会误导许多开发人员认为Date
与时区有内在关联——它不是,它只是一个瞬间,没有关联的时间区甚至日历系统。
我可以确认所有三个调用都可能取决于当地时间,考虑到时代,而不是Date.toString()
或任何类似的方法。 我已经看到它们依赖于运行 Android 2.3 的特定设备的本地时间。 我还没有用其他设备和安卓版本测试过它们。 在这种情况下,本地时间是手动设置的。
获得独立 UTC 时间的唯一可靠方法是使用GPS_PROVIDER
请求位置更新。 从NETWORK_PROVIDER
检索到的位置的getTime()
值也取决于本地时间。 例如,另一个选项是 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;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.