有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 1 楼答案

    TL;博士

    使用如下定义的系统属性java.locale.providers运行Java 9及更高版本(包括Java 11):

    java -Djava.locale.providers=COMPAT,CLDR YourApp
    

    现在输出不带点,格式与Java 8相同,例如:

    Tue, 16 Jul 2019 14:24:15 AEST

    CLDR

    Java从多达四个来源获取其语言环境数据,包括不同语言中用于一周几天和几个月的缩写。默认情况下,Java自己的语言环境数据最多为Java8Java。来自Unicode公共语言环境数据存储库(CLDR;请参阅底部的链接)的Java 8语言环境数据也包括在内,而来自Java 9的语言环境数据是默认值。通过在上面的系统属性中指定COMPAT,Java自己的数据仍然可以被包含和访问。我们需要将其放在字符串中的第一位,因为源代码会依次尝试

    人们可能已经预料到,另一个(甚至可能是更好的)解决方案是在所有Java版本中使用CLDR。奇怪的是,在本例中,所有Java版本的格式都不相同。下面是将属性设置为CLDR,JRE时的输出(JRE是COMPAT的旧名称,在Java8上我们需要使用它)

    在Java 8上:

    Tue, 16 Jul 2019 14:35:02 AEST

    在Java 9和11上:

    Tue., 16 Jul. 2019 14:35:52 AEST

    CLDR有不同的版本,不同的Java版本包含不同的版本

    爪哇。时间

    以下是我用于上述输出的代码片段

        DateTimeFormatter formatter = DateTimeFormatter.ofPattern(
                "EEE, dd MMM yyyy HH:mm:ss zzz", Locale.forLanguageTag("en-AU"));
        ZonedDateTime now = ZonedDateTime.now(ZoneId.of("Australia/Sydney"));
        System.out.println(now.format(formatter));
    

    我正在使用和推荐java。时间,现代Java日期和时间API。您使用的日期时间类SimpleDateFormatDate已经过时很久了,而且总是设计得很糟糕,因此我建议避免使用它们。在Java8和更高版本上,我们当然没有理由使用它们,而Java。时间也被向后移植到Java6和Java7

    链接