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

Java Android上的String.format()应该是时区感知的吗?,java,android,timezone,string-formatting,Java,Android,Timezone,String Formatting,我使用以下代码将GPS位置的时间戳转换为人类可读的形式: String.format("%1$tY-%1$tm-%1$td %1$tH:%1$tM:%1$tS", location.getTime()) 根据,GPS位置时间戳应以UTC为单位。但是,我返回的字符串是本地时间(在两个不同的设备上测试) 我尝试过使用另一种形式的String.format(),它接受一个额外的Locale参数,并向它传递一个空的Locale(根据文档,这意味着“无本地化”)——仍然是一样的。(而且Locale的文档

我使用以下代码将GPS位置的时间戳转换为人类可读的形式:

String.format("%1$tY-%1$tm-%1$td %1$tH:%1$tM:%1$tS", location.getTime())
根据,GPS位置时间戳应以UTC为单位。但是,我返回的字符串是本地时间(在两个不同的设备上测试)

我尝试过使用另一种形式的
String.format()
,它接受一个额外的
Locale
参数,并向它传递一个空的Locale(根据文档,这意味着“无本地化”)——仍然是一样的。(而且
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()
应该进行时区转换吗?如何影响此行为,即选择要转换到的时区或完全禁止转换?

String.format不支持时区。使用乔达时间图书馆。库中的DateTimeZone和datetimeformat类将允许您格式化时区感知的datetime。你会在网上看到很多关于如何做到这一点的例子,所以我不在这里详细介绍。:)

String.format不支持时区。使用乔达时间图书馆。库中的DateTimeZone和datetimeformat类将允许您格式化时区感知的datetime。你会在网上看到很多关于如何做到这一点的例子,所以我不在这里详细介绍。:)

String.format
表示默认时区中的日期/时间。要使用UTC格式,请改用
SimpleDataFormat
,在这里可以明确设置要使用的时区:

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));
}
例如:

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

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

String。format
表示默认时区中的日期/时间。要使用UTC格式,请改用
SimpleDataFormat
,在这里可以明确设置要使用的时区:

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));
}
例如:

System.out.println(formatInUtc(0L)); //  1970-01-01 00:00:00
顺便说一下,区域设置和时区是正交的:区域设置决定文本表示的各个方面(数字、符号、分隔符、语言),而时区决定时钟如何从UTC移动。

如果
String.format()
完全不知道时区,我希望
0L=>1970-01-01 00:00:00
,但显然,时区意识有限,因为它希望输入是UTC格式,输出格式是本地时间——它缺少的是一种影响处理的方式。我最终使用了
DateFormat
,因为它很容易获得并且非常简单。如果
String.format()
完全不知道时区,我希望
0L=>1970-01-01 00:00
,但显然,时区意识有限,因为它希望输入是UTC格式,输出格式是本地时间——它缺少的是一种影响处理的方式。我最终使用了
DateFormat
,因为它很容易获得,而且非常简单。