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

问题描述 投票:91回答:3

我想得到当前的UTC时间(以毫秒为单位),我在google上搜索了一下,得到的答案是System.currentTimeMillis()会返回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时间?

java android datetime utc java.util.date
3个回答
130
投票

你所显示的三行都会给出自unix纪元以来的毫秒数,这是一个固定的时间点,不受当地时区的影响。

你说 "这个时间不是UTC时间"--我怀疑你其实诊断错了。我建议你使用 epochconverter.com 为此。例如,在你的例子中。

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

我们不知道你是什么时候产生的那个值,但是除非它是 其实 在世界协调时上午8点01分,这是你的系统时钟的问题。

既不是 System.currentTimeMillis 价值也不在一个 Date 本身受到时区的影响。但是,您应该知道 Date.toString() 是否 使用当地时区,这就误导了许多开发者,让他们以为在当地时区使用的是 Date 是与时区有内在联系的--不是的,它只是时间上的一个瞬间,没有相关的时区,甚至没有日历系统。


3
投票

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

获取独立的UTC时间的唯一可靠的方法就是使用 GPS_PROVIDER. 该 getTime() 检索到的一个位置的值,从 NETWORK_PROVIDER 也取决于当地时间。另一个选择是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;
}
© www.soinside.com 2019 - 2024. All rights reserved.