此测试程序:
import org.joda.time.DateTime;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
import java.util.Locale;
public class Test
{
public static void main( String[] args )
{
DateTimeFormatter dateTimeFormatter = DateTimeFormat.forPattern( "dd-MMM-yyyy H:mm:ss z" ).withLocale( Locale.FRANCE );
String print = dateTimeFormatter.print( new DateTime() );
System.out.println( "print = " + print );
}
}
在Java 1.8.0_11和1.8.0_60上提供不同的输出:
更新11:11-sept.-2015 16:23:38 CEST
更新60:11-sept.-2015 16:21:46 +02:00
两者都在使用Joda Time 2.6。知道为什么会这样吗?
(使用带有Joda Time 2.0的Java 6也提供了11-sept.-2015 16:31:07 CEST
)
答案 0 :(得分:3)
请参阅与JDK 8u60相关的release notes of JodaTime 2.8.1。
2.8.1
的变化
以及相应的错误报告。
Joda Time使用DefaultNameProvider#getNameSet()
查找时区名称。这反过来使用返回java.text.DateFormatSymbols#getZoneStrings()
的基础JDK String[][]
。
在JodaTime< = 2.8 DefaultNameProvider#getNameSet()
中,代码如下所示:
if (strings != null && strings.length == 5 && id.equals(strings[0])) {
// ...
// we have found the time zone name
}
strings
是String[][]
返回的DateFormatSymbols#getZoneStrings()
数组的元素。请注意strings.length == 5
。
使用JDK< 8u60 DateFormatSymbols#getZoneStrings()
返回了5个元素的数组,例如
[America/Los_Angeles, Pacific Standard Time, PST, Pacific Daylight Time, PDT]
从JDK 8u60开始,它返回7个元素的数组,例如
[America/Los_Angeles, Pacific Standard Time, PST, Pacific Daylight Time, PDT, Pacific Time, PT]
因此strings.length == 5
条件失败。这已在Joda Time 2.8.1中更改为strings.length >= 5
并再次起作用(打印“CEST”)。