Java Android上的String.format()应该是时区感知的吗?
我使用以下代码将GPS位置的时间戳转换为人类可读的形式: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的文档
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
,因为它很容易获得,而且非常简单。