gpt4 book ai didi

"E"和 "MMM"添加句点的 Java 10 DateTimeFormatter 模式符号

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:01:07 32 4
gpt4 key购买 nike

因此在 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 镜像在美国语言环境中运行,而我的机器在澳大利亚语言环境中运行 :)

最佳答案

验证语言环境

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

语言环境在运行时变化

一个可能的问题是您在未明确指定 Locale 的情况下运行代码,这意味着您隐式依赖于 JVM 当前的默认区域设置。该默认值可能因运行时环境而异。

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

Locale.getDefault().toString()

研究下面的代码示例,了解如何明确指定您的 Locale。我建议始终使您的区域设置明确(顺便说一下,时区也是如此)。

运行时定义不同

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

对于这里讨论的特殊情况,当使用 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 );

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

10.0.2

en_US

Thu 30 Aug 2018

对于 Java 8,请参见相同的 code run live at IdeOne.com .请注意,IdeOne.com 中使用的 JVM 仅固定为单个区域设置,Locale.US

en_US

1.8.0_112

output: Thu 30 Aug 2018

澳大利亚

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

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 );

Thu. 30 Aug. 2018

关于 "E"和 "MMM"添加句点的 Java 10 DateTimeFormatter 模式符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52809339/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com