joda 时间与 java 时间的默认语言环境

Posted

技术标签:

【中文标题】joda 时间与 java 时间的默认语言环境【英文标题】:Default locale in joda time vs. java time 【发布时间】:2021-09-03 06:29:43 【问题描述】:

我最近从 org.joda.time 包更改为 java.time 包,我想知道两者有何不同 在使用默认语言环境时。 解析日期时使用区域设置; java.time 似乎使用系统语言和国家作为默认值 语言环境,而 joda.time 使用空值, 我可以看到使用

java.time.format.DateTimeFormatter.ISO_DATE.getLocale
org.joda.time.format.DateTimeFormat.fullDateTime().getLocale
en_US
null

关于 getLocale() 状态的 Joda 文档

    /**
     * Gets the locale that will be used for printing and parsing.
     * 
     * @return the locale to use; if null, formatter uses default locale at
     * invocation time
     */
    public Locale getLocale() 
        return iLocale;
    

这表示它在调用时使用默认语言环境。 这个默认值总是英语“en”吗? 如果我更改系统上的语言, java时间不会解析英文日期, 而 Joda time 仍然接受它。

【问题讨论】:

Never use SimpleDateFormat or DateTimeFormatter without a Locale 当系统语言不同时,我无法重现您所说的 Joda-Time 接受英语日期的说法。在我的丹麦 Mac 上,Joda-Time DateTimeFormat.longDate() 解析 19. juni 2021 但对英文对应项抛出异常:java.lang.IllegalArgumentException: Invalid format: "June 19, 2021" 【参考方案1】:

简短回答,不。

Jvm 使用自己的语言环境,这取决于底层系统语言环境配置,如果您想要一个稳定的默认语言环境配置,您应该为 jvm 提供与locale user.country user.variant, user 相关的参数。变体。提供 user.timezone 也很重要

【讨论】:

【参考方案2】:

你不应该在意。而是为您的解析和格式化明确指定所需的语言环境。如果要使用 JVM 的默认语言环境,请指定 Locale.getDefault(Locale.Category.FORMAT)

    DateTimeFormatter germanFormatter = DateTimeFormatter.ofLocalizedDate(FormatStyle.LONG)
            .withLocale(Locale.GERMAN);
    DateTimeFormatter frenchFormatter = DateTimeFormatter.ofLocalizedDate(FormatStyle.LONG)
            .withLocale(Locale.FRENCH);
    
    LocalDate sample = LocalDate.of(2021, Month.OCTOBER, 23);
    
    System.out.println(sample.format(germanFormatter));
    System.out.println(LocalDate.parse("31. März 2022", germanFormatter));
    
    System.out.println(sample.format(frenchFormatter));
    System.out.println(LocalDate.parse("30 août 2021", frenchFormatter));

输出:

23. Oktober 2021
2022-03-31
23 octobre 2021
2021-08-30

【讨论】:

以上是关于joda 时间与 java 时间的默认语言环境的主要内容,如果未能解决你的问题,请参考以下文章

如何在 JVM 中设置默认语言环境?

如何将 Joda-Time 与 java.sql.Timestamp 一起使用

在 Java 中的外国语言环境中格式化货币

休眠 5 的 joda 时间兼容性问题

Sonar以Sonar默认语言环境之外的其他语言显示违规消息

如何使日期与语言环境无关?