Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java世界对本地化的认可——有什么含蓄吗?_Java_Localization_Internationalization_Formatting_Jvm - Fatal编程技术网

Java世界对本地化的认可——有什么含蓄吗?

Java世界对本地化的认可——有什么含蓄吗?,java,localization,internationalization,formatting,jvm,Java,Localization,Internationalization,Formatting,Jvm,在.NETCurrentCulture和CurrentUICulture中,在许多情况下隐式使用属性。 例如,在DateTime值上调用ToString(),将根据当前用户的区域性设置格式化日期和时间。 相反,Java的LocalDate.toString()具有固定格式,除非显式使用格式化程序 因此,有一个问题: Java是否避免了对语言环境的隐式依赖,并且有一些固定的格式,除非开发人员明确指定?我应该担心这种暗示吗?toString不用于演示 大多数类上的toString方法实现是对象值的文

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

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

因此,有一个问题:

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

toString
不用于演示 大多数类上的
toString
方法实现是对象值的文本表示,用于调试和记录,而不是在用户界面中显示。
toString
方法在Java中所有类的根超类中定义:

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

java.time
格式
方法 为了向用户演示,通常使用
toString
以外的方法

time框架有一个
格式
方法的约定,您可以将对象传递给该方法。通过调用Localized…方法的静态因子,可以使格式化程序自动本地化

ZoneDateTime
示例 产出:2017年12月28日美国东部夏令时16:28:00

zdt.toString():2017-08-28816:28:00.107907-04:00[美国/蒙特利尔]

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

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

LocalDate ld = zdt.toLocalDate() ;
DateTimeFormatter f2 = DateTimeFormatter.ofLocalizedDate( FormatStyle.FULL ).withLocale( l  );
String output2 = ld.format( f2 );
产出2:2017年12月28日伦迪

ld.toString():2017-08-28

隐式默认值 至于隐式默认值,是的,如果您没有指定,java.time类将隐式使用JVM当前的默认值
Locale
。时区也一样

我建议养成一个习惯,总是显式地指定这两个属性,正如我在上面的代码示例中看到的那样。这两个都可以在运行时(!)期间由该JVM中运行的任何应用程序的任何线程中的任何代码更改。因此,依赖违约是不可靠的

避免遗留日期时间类
仅供参考,被java.time取代的遗留日期时间类设计得很糟糕,包括一些不规则的格式选择。不要把这些看作是正确设计的指导。

Java在这方面非常不一致。我的建议是阅读您需要的每个实例的文档。文档中不是说
输出将采用ISO-8601格式uu-MM-dd
?或者我遗漏了什么?@Eugene问题不是关于
LocalDate.toString
本身,而是关于主题的一般方法。根据经验,依赖
toString()
返回的内容是危险的。有很多值得注意的例外情况(最重要的是
StringBuilder
),但是在不首先检查文档的情况下调用
toString()
,应该总是会有所不同。(话虽如此,在每个会话都可以为UI配置不同语言的web服务器上,这些隐式依赖关系是如何工作的?)
LocalDate ld = zdt.toLocalDate() ;
DateTimeFormatter f2 = DateTimeFormatter.ofLocalizedDate( FormatStyle.FULL ).withLocale( l  );
String output2 = ld.format( f2 );