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