为了账号安全,请及时绑定邮箱和手机立即绑定

用于“E”和“MMM”添加句点的 Java 10 DateTimeFormatter 模式符号

用于“E”和“MMM”添加句点的 Java 10 DateTimeFormatter 模式符号

沧海一幻觉 2021-11-17 17:18:32
所以在 Java 8 中如下:DateTimeFormatter df = DateTimeFormatter.ofPattern("E d MMM yyyy");当以这种方式应用时:LocalDate date = LocalDate.now(); date.format(df);会产生这样的东西:"Available on Thu 30 Aug 2018"但是,在 Java 10 中运行时完全相同的代码会产生以下结果:"Available on Thu. 30 Aug. 2018"请注意日和月部分之后的句点...我很清楚我可以只替换字符串中的句点,但我真的不想这样做。我想知道为什么会发生这种变化,是否有替代模式?我在网上找不到任何有关此更改的参考。编辑:根据下面 Basil 的回答,这不是 Java 版本问题。这是语言环境问题。带有我的代码的 docker 映像在美国语言环境中运行,而我的机器在澳大利亚语言环境中运行 :)
查看完整描述

1 回答

?
HUX布斯

TA贡献1876条经验 获得超6个赞

核实 Locale

标点符号和相关事项(缩写、拼写、元素顺序)被定义为文化规范的一部分。在 Java 中,这些文化规范由Locale.


语言环境在运行时变化

一个可能的问题是您正在运行的代码没有明确指定Locale,这意味着您隐式地依赖于 JVM 的当前默认语言环境。该默认值可能因运行时环境而异。


记录您的默认语言环境以进行验证。


Locale.getDefault().toString()

研究下面的代码示例以了解如何Locale明确指定您的。我建议总是让你Locale明确(同上,对时区,顺便说一句)。


定义在运行时有所不同

请注意,Java 9 的日期时间本地化发生了重大变化:JEP 252: Use CLDR Locale Data by Default。至少对于基于 OpenJDK 的 JVM,有关这些文化规范的信息来源已切换到Unicode Consortium提供的Common Locale Data Repository。


对于此处讨论的特定情况,使用 时Locale.US,我们看不到任何区别,如下面的代码示例所示。但是对于某些语言环境,您可能确实会看到 Java 8 及更早版本与 Java 9 及更高版本之间的差异。


所以,再次,我想知道您的问题的第二个示例中是否涉及不同的语言环境。解决方法是明确指定您或您的用户期望的语言环境,而不是隐式依赖 JVM 当前的瞬时默认值(默认值可以在运行时随时更改!)。


无法确认问题

System.out.println( System.getProperty( "java.version" ) );

System.out.println( Locale.getDefault().toString() );


LocalDate ld = LocalDate.of( 2018 , Month.AUGUST , 30 );


Locale locale = Locale.US;

DateTimeFormatter f = DateTimeFormatter.ofPattern( "E d MMM yyyy" , locale );

String output = ld.format( f );


System.out.println( output );

当在 macOS High Sierra 下的 MacBook Pro Retina 上通过Azul Systems基于 OpenJDK 的Zulu JVM在 IntelliJ 2018.3 中运行 Java 10.0.2 时,我得到:


10.0.2


en_US


2018 年 8 月 30 日星期四


对于 Java 8,请在 IdeOne.com 上查看实时运行的相同代码。请注意,IdeOne.com 中使用的 JVM 仅固定为单个区域设置Locale.US.


en_US


1.8.0_112


输出:2018 年 8 月 30 日星期四


澳大利亚

下面是一个示例,说明您的输出如何在其他一些英语地区(例如澳大利亚)中成为常态。


LocalDate ld = LocalDate.of( 2018 , Month.AUGUST , 30 );


Locale locale = new Locale( "en" , "AU" );  // "en-AU" is English Australia.

DateTimeFormatter f = DateTimeFormatter.ofPattern( "E d MMM yyyy" , locale );

String output = ld.format( f );

星期四 2018 年 8 月 30 日


查看完整回答
反对 回复 2021-11-17
  • 1 回答
  • 0 关注
  • 173 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信