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



我很困惑。我必须承认,我可能不会在正确的位置寻找此错误。就是说...

我们将dd MMM YYY HH:mm:ss z用于日期格式字符串。该小写z应返回该区域的三个字母缩写,例如PSTCET。而且确实如此。除生产以外的地方。生产时,我们得到偏移,例如-08:00。我们通过战争验证了我们到处都使用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

我注意到这个问题,提出了一个地方信息丢失的想法,只留下了偏移。不过,无论我用什么用于timezonelocale,我都无法复制它。而且,当然,我们不使用forOffsetHours

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

第二次编辑:哦,JVM到处都是相同的。

这可能与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"one_answers" PDT"为America/los_angeles在英语语言环境中。

我无法再现此问题,但是我认为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版本。

我唯一可以获得确切的意外格式的方法是,如果我使用大写z代替该小写z

好吧,那是因为一个大写z给了您偏移,如Javadoc中所述:http://www.joda.org/joda time/apidocs/apidocs/org/org/joda/joda/time/time/time/datement/datempetimeformat.htemperformat.html

区域:'z'输出偏移而没有colon ,'zz'输出带有colon的偏移,'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

很有可能是某个集体路径问题。

在我们的项目中,我们能够重现此问题,包括Jodatime 2.9.2和2.4 class Path。

我们不知道我们包括旧版本。它没有在依赖树中显示。最终,我们在一些旧的脂肪罐依赖性中找到了Joda课,实际上我们不再需要。

牢记,班级路径问题可能是环境之间的不确定性的。

相关内容

  • 没有找到相关文章

最新更新