Java 为什么在评估ZoneInfo部件时,GregorianCalendar和OffsetDateTime之间的转换失败?

Java 为什么在评估ZoneInfo部件时,GregorianCalendar和OffsetDateTime之间的转换失败?,java,gregorian-calendar,Java,Gregorian Calendar,我正在将OffsetDateTime转换为GregorianCalendar,作为填充出站web服务值的一部分。我只是想测试一下实际的转换 它失败了,我不明白为什么-以下是测试方法: @Test public void testOffsetDateTimeToGregorianCalendar() { // given the current gregorian utc time GregorianCalendar expectedGregorianUtcNow = new Gr

我正在将OffsetDateTime转换为GregorianCalendar,作为填充出站web服务值的一部分。我只是想测试一下实际的转换

它失败了,我不明白为什么-以下是测试方法:

@Test
public void testOffsetDateTimeToGregorianCalendar() {
    // given the current gregorian utc time
    GregorianCalendar expectedGregorianUtcNow = new GregorianCalendar(TimeZone.getTimeZone("UTC"));
    OffsetDateTime expectedUtcOffsetDateTime = OffsetDateTime.from(expectedGregorianUtcNow.toZonedDateTime());

    // when converting to a GregorianCalendar
    GregorianCalendar actualGregorianUtcNow = GregorianCalendar.from(expectedUtcOffsetDateTime.toZonedDateTime());

    // then make sure we got the correct value
    assertThat(actualGregorianUtcNow, equalTo(expectedGregorianUtcNow));
}
在equalto中,在计算gregorianCutover时比较失败。为什么?这是虫子吗

看起来实际情况是: gregorianCutover=-9223372036854775808 预计将有: gregorianCutover=-12219292800000

从单元测试输出中可以看出,其他一切都是正确的(gregorianCutover没有出现在那里):

java.lang.AssertionError:
预期:
但是:是吗

我做错什么了吗?

基本上,据我所知,
java.time
不会尝试对公历转换进行建模-因此,当
OffsetDateTime
转换回
gregoriandar
时,可以通过将其建模为公历,并在时间开始时进行转换来完成。因此,
gregoriacalendar.from(ZoneDateTime)
的文档如下:

由于
ZoneDateTime
不支持朱利安公历转换日期,并使用ISO日历系统,因此返回的
GregorianCalendar
是一个纯公历,并使用ISO 8601标准定义周,其中,星期一为
FirstDayOfWeek
,4为
minimadaysinfirstweek
的值


理想情况下,我建议您避免在日期/时间API方面使用
java.util.*
。。。在任何地方都要坚持使用
java.time
。但是如果你真的需要,我可能会建议你不要使用
gregoriacalendar.equals
来测试相等性-如果你感兴趣的话,分别检查即时时间和时区。

谢谢。。。我将不使用equals方法,但不使用api是不可能的,因为当您尝试集成到从jaxb生成的web服务时,生成的DateTimeOffset工厂要求您为其提供GregorianCalendar
    java.lang.AssertionError: 
    Expected:<java.util.GregorianCalendar[time=1458667828375,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="UTC",offset=0,dstSavings=0,useDaylight=false,transitions=0,lastRule=null],firstDayOfWeek=2,minimalDaysInFirstWeek=4,ERA=1,YEAR=2016,MONTH=2,WEEK_OF_YEAR=12,WEEK_OF_MONTH=4,DAY_OF_MONTH=22,DAY_OF_YEAR=82,DAY_OF_WEEK=3,DAY_OF_WEEK_IN_MONTH=4,AM_PM=1,HOUR=5,HOUR_OF_DAY=17,MINUTE=30,SECOND=28,MILLISECOND=375,ZONE_OFFSET=0,DST_OFFSET=0]>
    but: was <java.util.GregorianCalendar[time=1458667828375,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="UTC",offset=0,dstSavings=0,useDaylight=false,transitions=0,lastRule=null],firstDayOfWeek=2,minimalDaysInFirstWeek=4,ERA=1,YEAR=2016,MONTH=2,WEEK_OF_YEAR=12,WEEK_OF_MONTH=4,DAY_OF_MONTH=22,DAY_OF_YEAR=82,DAY_OF_WEEK=3,DAY_OF_WEEK_IN_MONTH=4,AM_PM=1,HOUR=5,HOUR_OF_DAY=17,MINUTE=30,SECOND=28,MILLISECOND=375,ZONE_OFFSET=0,DST_OFFSET=0]>