我使用以下代码将GPS位置的时间戳转换为人类可读的形式:
String.format("%1$tY-%1$tm-%1$td %1$tH:%1$tM:%1$tS", location.getTime())
根据the docs,GPS位置时间戳应为UTC。但是,我回来的字符串是在当地时间(在两个不同的设备上测试)。
我尝试使用String.format()
的另一种形式,它接受一个额外的Locale
参数,并传递一个空的语言环境(根据文档,这意味着“没有本地化”) - 仍然相同。 (并且Locale
的文档根本没有提及时区,因此我怀疑语言环境是这里的问题。)
我的另一个怀疑是GPS堆栈可能不符合规定,提供本地时间而不是UTC。我用
测试了这个String.format("%1$tY-%1$tm-%1$td %1$tH:%1$tM:%1$tS", (long) 0)
返回
1970-01-01 01:00:00
这是纪元的开始加上CET的时区偏移(设备的时区)。因此,String.format()
明确地添加了偏移量。
String.format()
是否应该进行任何时区转换?我如何影响这种行为,即选择转换为或完全禁止转换的时区?
答案 0 :(得分:1)
String.format不能识别时区。使用Joda时间库。库中的datetime zone和datetimeformat类将允许您设置可识别时区的日期时间。你会在网上得到很多关于如何做到这一点的例子,所以我不会在这里详细介绍。 :)
答案 1 :(得分:1)
String.format
代表默认时区的日期/时间。要以UTC格式化,请改用SimpleDateFormat
,您可以在其中明确设置要使用的时区:
String formatInUtc(long millis) {
DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.ROOT);
df.setTimeZone(TimeZone.getTimeZone("UTC"));
return df.format(new Date(millis));
}
电子。 G:
System.out.println(formatInUtc(0L)); // 1970-01-01 00:00:00
顺便说一下,语言环境和时区是正交的东西:locale确定文本表示的方面(数字,符号,分隔符,语言),而时区确定时钟如何从UTC转移。