java - Android 上的 String.format() 应该能够感知时区吗?

标签 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 参数,并向其传递一个 null 语言环境(根据docs,意思是“没有本地化”)——还是一样。 (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() 应该进行任何时区转换吗?我如何影响此行为,即选择要转换到的时区或完全抑制转换?

最佳答案

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));
}

E.例如:

System.out.println(formatInUtc(0L)); //  1970-01-01 00:00:00

顺便说一句,区域设置和时区是正交的:区域设置决定文本表示的各个方面(数字、符号、分隔符、语言),而时区则决定时钟如何从 UTC 偏移。

关于java - Android 上的 String.format() 应该能够感知时区吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36363321/

相关文章:

java - Eclipse android 项目报错?

c++ - 使用 boost 将 UTC 时间转换为自定义时区

java - 如何从 Matrix 光标填充 ListView

java - 尝试将我的 Java 测试代码与 OpenTest 一起使用

java - ProviderInstaller 在模拟器上不起作用,并且未读取捕获的错误

java - 将 swagger 导入到 Android Studio 中的现有项目中

android - 远程 logcat - Android Studio

ruby-on-rails - 在 Rails 中保留时区

javascript - 需要建议 : Use server time or user machine's time?

java - 如何点击页面刷新时 id 不断变化的日期选择器