繁体   English   中英

System.currentTimeMillis() 是否返回 UTC 时间?

[英]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.currentTimeMillisDate本身中的值都不受时区影响。 但是,您应该知道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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM