我想以毫秒获得当前的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时间?
答案 0 :(得分:113)
你显示的所有三行都会给出自unix时代以来的毫秒数,这是一个固定的时间点,不受当地时区的影响。
你说“这个时间不是UTC时间” - 我怀疑你确实错误地诊断出来了。我建议使用epochconverter.com。例如,在您的示例中:
1372060916 = Mon, 24 Jun 2013 08:01:56 GMT
我们不知道您何时生成该值,但除非在UTC时间上午8:01 ,否则系统时钟会出现问题。
System.currentTimeMillis
和Date
内的值都不受时区影响。但是,您应该知道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;
}