当前位置: 首页 > 知识库问答 >
问题:

为什么在计算ZoneInfo部分时,GregorianCalendar和OffsetDateTime之间的转换失败?

邓季
2023-03-14

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

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

@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));
}
    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]>

我做错什么了吗?

共有1个答案

桓宜
2023-03-14

基本上,据我所知,java.time并不试图对公历转换进行建模-因此,当offsetdatetime转换回gregoriancalendar时,可以将其建模为在时间开始时具有转换的公历。因此gregoriancalendar.from(ZoneDateTime)的文档:

由于ZonedDateTime不支持朱利安-公历截止日期并使用ISO日历系统,因此返回的GregorianCalendar是一个纯公历,周定义使用ISO 8601标准,其中星期一作为FirstDayOfWeek,4作为MinimalDaysinFirstWeek的值。

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

 类似资料:
  • 这很可能是一个寻找问题的解决方案。。。如果是这样,我请求你的原谅 可能的实施: 这样的解释是:如果计算成功,就让它失败;如果计算失败,就让它成功。我不确定,但这似乎有点像MonadPlus的反面。。。如果你眯起眼睛真的很难??? 这个概念有没有标准的typeclass或其他实现?如果有的话,底层的数学是什么样的(例如,这是一个半群、一个循环等)?

  • 我正在转换日期时间(2021-10-15 18:30:00UTC,2021-10-15 18:30:00 0000)日期时间组件,但它缺少小时,分钟和秒 ▿ 2021-10-15 18:30:00 0000 时间间隔自参考日期:656015400.0 时区:GMT(固定)年份:2021月:10天:11小时:0分钟:0秒:0 isLeapMonth:false时区:GMT(固定)-标识符:“GMT”

  • 当将同一时间从Sri Jeyawardenepura转换回珀斯时(1/31/2005 11:30 PM),它转换到1/1/2006 3:00 AM。 时区换算为什么会有一个小时的差?

  • 问题内容: 如何将输入的生日字符串(如02 26 1991)放入公历? 我尝试首先解析它,但是它一直给我一条错误消息,所以我不太确定自己在做什么错。在此日期之前,我还有其他输入数据。一个是另一个字符串,一个是双精度值。 问题答案: 使用解析日期,然后将其分配给。 第三行可以替换为: 但我更喜欢第一个版本。

  • 问题内容: 我有一条流经多个系统的消息,每个系统都会记录消息的进入和退出以及时间戳和uuid messageId。我通过以下方式提取所有日志: 结果,我现在有以下事件: 我想生成一个报告(最好是堆积的条或列),用于每个系统的时间: 做这个的最好方式是什么?Logstash过滤器?kibana计算字段? 问题答案: 您只能使用Logstash 过滤器来实现此目的,但是,您必须实质性地重新实现该过滤器

  • 我正在尝试将JAXBElement-XMLGregorianCalendar转换为offsetDateTime。我可以这样做,但我想以特定格式转换日期。 代码我用于转换:日历值是2016-03-25T00:00:00 05:30,但我需要隐蔽类型以偏移Date时间所以我正在做下面的转换 作为响应,我在转换后得到的值:2016-03-24T18:30:00Z,而我想要转换后的值为:2016-03-2