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

2022-08-31 09:48:11

我想获取当前 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时间,而是我的时区时间。如何在安卓中获取当前的UTC时间?


答案 1

您显示的所有三行都将给出自 unix 纪元(一个固定的时间点)以来的毫秒数,不受本地时区的影响。

你说“这次不是UTC时间” - 我怀疑你实际上诊断错误。我建议为此使用 epochconverter.com。例如,在您的示例中:

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

我们不知道您何时生成了该值,但除非它实际上是在 UTC 时间上午 8:01,否则您的系统时钟存在问题。

本身的值都不受时区的影响。但是,您应该知道,确实使用本地时区,这会误导许多开发人员认为a与时区有固有的关联 - 它不是,它只是一个时间上的瞬间,没有关联的时区甚至日历系统。System.currentTimeMillisDateDate.toString()Date


答案 2

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

获取独立 UTC 时间的唯一可靠方法是使用 请求位置更新。从中检索到的位置的值还取决于本地时间。例如,另一个选项是 ping 返回 UTC 时间戳的服务器。GPS_PROVIDERgetTime()NETWORK_PROVIDER

因此,我所做的是以下内容:

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;
}