如何(正确)使用String.format%tz报告时区?

时间:2009-03-31 12:46:25

标签: java

如果我执行:

System.out.println("Formatter: " + String.format("%1$tH:%1$tM:%1$tS %1$tz %1$tZ", now));
System.out.println("SimpleDF : " + new SimpleDateFormat("HH:mm:ss Z z").format(now));

我希望结果是一样的。如果我检查自动调整夏令时,则值开始变化:

without dst (as expected, gmt=9:48):
Formatter: 10:48:16 +0100 GMT+01:00
SimpleDF : 10:48:16 +0100 GMT+01:00
with dst (gmt varies between formatter and sdf ???):
Formatter: 11:47:54 +0100 CEST
SimpleDF : 11:47:54 +0200 CEST

在win xp上运行,在java 1.6-10 / 13和1.5.0-14上运行相同的结果,locale en_US。你觉得怎么样,一个错误?

也许相关:http://bugs.sun.com/view_bug.do?bug_id=6286592

1 个答案:

答案 0 :(得分:1)

正确的方法是使用SimpleDateFormat(或更确切地说是DateFormat)对象。 String.format用于格式化作为在传递的对象上调用toString()方法的结果而返回的字符串。第一行代码可以细分为,

String temp = now.toString();
System.out.println("Formatter: " + String.format("%1$tH:%1$tM:%1$tS %1$tz %1$tZ", temp));

临时字符串对象使用默认语言环境和设置进行格式化,因此可能无法保证完美结果(根据我的经验)。

SimpleDateFormat()适用于Date对象并访问属性并确保所有DST补丁。