Java 世界的本地化方法 - 有什么隐含的含义吗?

标签 java localization internationalization formatting jvm

在 .NET 中,许多情况下会隐式使用 CurrentCultureCurrentUICulture 属性。
例如,对 DateTime 值调用 ToString() 将根据当前用户的区域性设置设置日期和时间的格式。

相反,Java 的 LocalDate.toString() 具有固定格式,除非显式使用格式化程序。

因此,有一个问题:

除非开发人员明确指定,否则 Java 是否避免对语言环境的隐式依赖并具有一些固定格式?我应该担心这种隐含的情况吗?

最佳答案

toString不用于演示

toString大多数类上的方法实现是对象值的文本表示,用于调试和日志记录,而不是在用户界面中显示。 toString方法定义在Java中所有类的根父类(super class)中: Object::toString() .

toString java.time 中的实现使用标准 ISO 8601格式。这些可能适合也可能不适合您的用户,具体取决于受众。请注意,将日期时间值序列化为文本以存储/交换数据流时,ISO 8601 格式是理想的选择。

java.time format方法

为了呈现给用户,一般使用toString以外的方法。

java.time 框架有一个约定 format向其传递 DateTimeFormatter 的方法目的。通过调用静态因子 ofLocalized… 可以使该格式化程序自动本地化。方法。

ZonedDateTime示例

ZoneId z = ZoneId.of( "America/Montreal" ) ;
// Better to specify time zone explicitly than rely on the default implicitly.
ZonedDateTime zdt = ZonedDateTime.now( z ) ;  
FormatStyle s = FormatStyle.LONG ; 
Locale l = Locale.CANADA_FRENCH ;
// Better to specify locale explicitly than rely on the default implicitly.
DateTimeFormatter f = DateTimeFormatter.ofLocalizedDateTime( s ).withLocale( l ) ; 
String output = zdt.format( f ) ;

output: 28 août 2017 à 16:28:00 EDT

zdt.toString(): 2017-08-28T16:28:00.107907-04:00[America/Montreal]

请注意ZonedDateTime::toString通过在方括号中附加时区名称,明智地扩展了 ISO 8601 格式。

LocalDate示例

至于你的LocalDate问题,我们可以从 ZonedDateTime 中提取仅日期值.

LocalDate ld = zdt.toLocalDate() ;
DateTimeFormatter f2 = DateTimeFormatter.ofLocalizedDate( FormatStyle.FULL ).withLocale( l  );
String output2 = ld.format( f2 );

output2: lundi 28 août 2017

ld.toString(): 2017-08-28

隐式默认值

对于隐式默认值,是的,java.time 类使用 JVM 的当前默认值 Locale如果您不指定,则隐式显示。时区也是如此。

我建议养成始终明确指定两者的习惯,如上面的代码示例所示。两者都可以在运行时(!)由该 JVM 中运行的任何应用程序的任何线程中的任何代码进行更改。所以依赖默认值是不可靠的。

避免遗留日期时间类

仅供引用,被 java.time 取代的遗留日期时间类设计得很糟糕,包括一些奇怪的格式选择。不要将这些视为正确设计的指导。

关于Java 世界的本地化方法 - 有什么隐含的含义吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45915181/

相关文章:

sql-server - SQL 插入 : comma as decimal

java - 如何使用java使用正则表达式搜索括号之间的文本?

JAVA外部框架来控制数组

java - 如何将菜单集成到布局 (Java GUI) 中?

ios - 本地化现有的 iOS 应用程序

iphone - UITableView 的本地化索引

javascript - HTML 自动化脚本

ruby-on-rails - 当内容是 html_safe 时,测试 View 会呈现已翻译的内容?

java - 查找我的浮点值 ArrayList 的最小值

php - 如何在PHP中获取包含组合字符的Unicode字符串的 "rendered length"?