java SimpleDataFormat。format()在Java8和Java11中给出了不同的结果
我有一段代码:
import java.text.SimpleDateFormat;
import java.util.Date;
public class Main {
public static void main(String[] args) {
SimpleDateFormat format = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss zzz");
System.out.println(format.format(new Date()));
}
}
对于Java 8,输出为:
Tue, 16 Jul 2019 13:16:54 AEST
使用Java 11:
Tue., 16 Jul. 2019 13:16:54 AEST
为什么会有差异?我应该如何修改代码以使其在两个Java版本中都能均匀工作
在发现这个问题时,我实际上使用了Handlebars,我可以将其缩小到Java版本,但是如果知道如何使用手柄为相同的格式字符串生成相同的结果,那就太酷了……)
# 1 楼答案
TL;博士
使用如下定义的系统属性
java.locale.providers
运行Java 9及更高版本(包括Java 11):现在输出不带点,格式与Java 8相同,例如:
CLDR
Java从多达四个来源获取其语言环境数据,包括不同语言中用于一周几天和几个月的缩写。默认情况下,Java自己的语言环境数据最多为Java8Java。来自Unicode公共语言环境数据存储库(CLDR;请参阅底部的链接)的Java 8语言环境数据也包括在内,而来自Java 9的语言环境数据是默认值。通过在上面的系统属性中指定
COMPAT
,Java自己的数据仍然可以被包含和访问。我们需要将其放在字符串中的第一位,因为源代码会依次尝试人们可能已经预料到,另一个(甚至可能是更好的)解决方案是在所有Java版本中使用CLDR。奇怪的是,在本例中,所有Java版本的格式都不相同。下面是将属性设置为
CLDR,JRE
时的输出(JRE是COMPAT的旧名称,在Java8上我们需要使用它)在Java 8上:
在Java 9和11上:
CLDR有不同的版本,不同的Java版本包含不同的版本
爪哇。时间
以下是我用于上述输出的代码片段
我正在使用和推荐java。时间,现代Java日期和时间API。您使用的日期时间类
SimpleDateFormat
和Date
已经过时很久了,而且总是设计得很糟糕,因此我建议避免使用它们。在Java8和更高版本上,我们当然没有理由使用它们,而Java。时间也被向后移植到Java6和Java7链接