什么可能导致joda时间输出的这种差异?

时间:2015-09-11 14:32:22

标签: java jodatime

此测试程序:

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

1 个答案:

答案 0 :(得分:3)

请参阅与JDK 8u60相关的release notes of JodaTime 2.8.1

  

2.8.1

的变化      
      
  • 已修复以处理JDK 8u60 [#288#291] >如果没有此修复,格式化时区将为GMT时区打印“+00:00”而不是“GMT”
  •   

以及相应的错误报告。

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
}

stringsString[][]返回的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”)。