Android上的String.format()是否应该是时区感知的?

时间:2016-04-01 18:23:55

标签: java android timezone string-formatting

我使用以下代码将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()是否应该进行任何时区转换?我如何影响这种行为,即选择转换为或完全禁止转换的时区?

2 个答案:

答案 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转移。