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-TimeDateTimeFormat.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 时间的默认语言环境的主要内容,如果未能解决你的问题,请参考以下文章
如何将 Joda-Time 与 java.sql.Timestamp 一起使用