【问题标题】:Joda Date Time returns very different results between Java 8 vs Java 11Joda Date Time 在 Java 8 和 Java 11 之间返回非常不同的结果
【发布时间】:2020-07-26 16:49:54
【问题描述】:

如果我在 Java 8 中运行以下代码:-

package au.com.tt.agora.debug.web;

import java.util.TimeZone;

import org.joda.time.DateTimeZone;
import org.joda.time.LocalDate;

public class Test
{

    public static void main(String[] args)
    {
        String newDate = new LocalDate().toString("ddMMMyy");
        System.out.println(newDate);
        System.out.println(TimeZone.getDefault());
        System.out.println(DateTimeZone.getDefault());
    }

}

我得到这个结果:-

14Apr20
sun.util.calendar.ZoneInfo[id="Australia/Sydney",offset=36000000,dstSavings=3600000,useDaylight=true,transitions=142,lastRule=java.util.SimpleTimeZone[id=Australia/Sydney,offset=36000000,dstSavings=3600000,useDaylight=true,startYear=0,startMode=3,startMonth=9,startDay=1,startDayOfWeek=1,startTime=7200000,startTimeMode=1,endMode=3,endMonth=3,endDay=1,endDayOfWeek=1,endTime=7200000,endTimeMode=1]]
Australia/Sydney

我在 Java 11 中运行相同的代码,得到以下结果:-

14Apr.20
sun.util.calendar.ZoneInfo[id="Australia/Sydney",offset=36000000,dstSavings=3600000,useDaylight=true,transitions=142,lastRule=java.util.SimpleTimeZone[id=Australia/Sydney,offset=36000000,dstSavings=3600000,useDaylight=true,startYear=0,startMode=3,startMonth=9,startDay=1,startDayOfWeek=1,startTime=7200000,startTimeMode=1,endMode=3,endMonth=3,endDay=1,endDayOfWeek=1,endTime=7200000,endTimeMode=1]]
Australia/Sydney

注意 . 4 月到 20 日之间。这是 Java 11 中 Joda 日期时间的错误还是新功能?

更新 我正在使用 Joda v2.10.5。另外,这段代码:-

包au.com.tt.agora.debug.web;

导入 java.time.format.DateTimeFormatter; 导入 java.util.TimeZone;

导入 org.joda.time.DateTimeZone; 导入 org.joda.time.LocalDate;

public class Test
{

    public static void main(String[] args)
    {
        LocalDate joda = new LocalDate();
        java.time.LocalDate date = java.time.LocalDate.of(joda.getYear(), joda.getMonthOfYear(), joda.getDayOfMonth());
        System.out.println(date.format(DateTimeFormatter.ofPattern("ddMMMyy")));
        System.out.println(TimeZone.getDefault());
        System.out.println(DateTimeZone.getDefault());
    }

}

对日期产生相同的结果。我在 Windows 上使用 Java 11.0.6。

更新 2 原来这是一个语言环境问题。在 Java 8 和 Java 11 之间,某些语言环境(特别是 en_AU 和 en_CA)处理日期的方式发生了变化。详情请看这里:-

https://bugs.openjdk.java.net/browse/JDK-8211750

必须弄清楚在这种情况下我必须做什么,但至少我了解问题所在。

【问题讨论】:

标签: java java-8 jodatime java-11


【解决方案1】:

原来这是一个语言环境问题。在 Java 8 和 Java 11 之间,某些语言环境(例如 en_AU 和 en_CA)处理日期的方式发生了变化。详情请看这里:-

https://bugs.openjdk.java.net/browse/JDK-8211750

必须弄清楚在这种情况下我必须做什么,但至少我了解问题

【讨论】:

  • 很好的研究。但是,您示例中的时区代码无关紧要,只会令人困惑。使用 JRE 启动参数 -Djava.locale.providers=COMPAT 将是一个选项。甚至更好:你会习惯改变的本地化风格,因为底层的 CLDR 文本资源不是一成不变的,你不应该将任何重要的逻辑建立在文本样式上。
猜你喜欢
  • 2020-07-08
  • 1970-01-01
  • 2014-08-22
  • 1970-01-01
  • 1970-01-01
  • 2019-10-27
  • 1970-01-01
  • 1970-01-01
  • 2020-08-22
相关资源
最近更新 更多