System.currentTimeMillis()返回UTC时间吗?

时间:2013-06-24 08:28:31

标签: java android datetime utc java.util.date

我想以毫秒获得当前的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时间?

2 个答案:

答案 0 :(得分:113)

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

你说“这个时间不是UTC时间” - 我怀疑你确实错误地诊断出来了。我建议使用epochconverter.com。例如,在您的示例中:

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

我们不知道您何时生成该值,但除非在UTC时间上午8:01 ,否则系统时钟会出现问题。

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

答案 1 :(得分:2)

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

获得独立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;
}