日期时间格式的小写z返回偏移量,而不是缩写

时间:2018-02-20 19:21:11

标签: java datetime timezone jodatime datetime-format

我很难过。我必须承认,我可能找不到适合这个bug的地方。那说......

我们使用dd MMM YYY HH:mm:ss z作为日期格式字符串。该小写z应返回该区域的三个字母缩写,例如PSTCET。确实如此。到处都是生产。在生产中我们得到偏移量,如-08:00。我们通过WAR验证了我们在任何地方都使用了joda 2.9.2。

我们使用dateTime.withZone(DateTimeZone.forID(timezone)).toString(dateFormat, locale)其中dateTimeDateTimetimezoneString(经验证的实例相同,America/Los_Angeles )。如上所述,dateFormat dd MMM YYY HH:mm:ss zlocale已跨实例验证为en

我注意到这个SO question,它提出了区域设置信息丢失的想法,只留下偏移量。尽管如此,无论我对timezonelocale使用什么,我都无法重现。当然,我们不会使用forOffsetHours

编辑:为了它的价值,我不认为它是语言环境,因为我可以在.toString(dateFormat, locale)中使用new Locale("hasdf")的{​​{{{{ 1}}和日期格式符合预期。我可以获得这种确切意外格式的唯一方法是使用大写Z代替小写z

第二次编辑:哦,JVM在任何地方都是一样的。

4 个答案:

答案 0 :(得分:1)

这可能与您JVM中的区域设置数据有关(请检查您的版本,以确保它们在所有环境中都完全相同)。

无论如何,有一种解决方法可以覆盖Joda用于时区名称的文本。您需要扩展org.joda.time.tz.DefaultNameProvider

public class MyNameProvider extends DefaultNameProvider {

    @Override
    public String getShortName(Locale locale, String id, String nameKey, boolean standardTime) {
        if (Locale.ENGLISH.equals(locale) && "America/Los_Angeles".equals(id)) {
            // return the correct name for Daylight Saving Time
            return standardTime ? "PST" : "PDT";
        }

        return super.getShortName(locale, id, nameKey, standardTime);
    }
}

然后你做:

DateTimeZone.setNameProvider(new MyNameProvider());

DateTime d = new DateTime().withZone(DateTimeZone.forID("America/Los_Angeles"));
System.out.println(d.toString("dd MMM YYY HH:mm:ss z", Locale.ENGLISH));

这将覆盖JVM使用的任何数据,并始终在英语区域设置中使用“PST”和“PDT”表示America / Los_Angeles。

答案 1 :(得分:0)

我无法重现这个问题,但我认为Joda从JVM本身获取此信息。

您可以使用以下代码查看Joda正在使用的数据:

String[][] zoneStringsEn = DateTimeUtils.getDateFormatSymbols(Locale.ENGLISH).getZoneStrings();
for (String[] strings : zoneStringsEn) {
    if (strings != null && strings.length >= 5 && "America/Los_Angeles".equals(strings[0])) {
        System.out.println(strings[2]); // "PST" in my JVM
    }
}

可能无法使用的环境有不同的JVM版本。

答案 2 :(得分:0)

  

我可以获得那种确切意外格式的唯一方法是使用大写字母Z代替小写字母z

嗯,那是因为一个大写的Z为你提供了偏移量,如javadoc中所述:http://www.joda.org/joda-time/apidocs/org/joda/time/format/DateTimeFormat.html

  

区域:'Z'输出不带冒号的偏移,'ZZ'输出冒号,'ZZZ'或更多输出区域ID。

小写z为您提供区域名称:

Symbol  Meaning               Presentation   Examples
------  -------               ------------   -------
z       time zone             text           Pacific Standard Time; PST
Z       time zone offset/id   zone           -0800; -08:00; America/Los_Angeles

答案 3 :(得分:0)

很有可能会出现类路径问题。

在我们的项目中,我们能够在类路径上重现这个问题,包括JodaTime 2.9.2和2.4。

我们不知道我们包含旧的2.4版本。它没有在依赖树中显示。最终,我们发现joda类在一些旧的胖JAR依赖项中实际上不再需要了。

请记住,类路径问题在环境之间可能是不确定的。