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

将 LocalDateTime 的格式设置为 XMLGregorianCalender 并带有偏移量

宦翔
2023-03-14

我有一个LocalDateTime的实例。

我需要映射它XMLGregorianCalendar(这里使用JAXB ),在最终的XML中,我希望时间在XML文档中看起来像下面这样:2020-03-04T19:45:00.000 1:00 (1小时是UTC的偏移量)。

我尝试过使用DateTimeFormatter将LocalDateTime转换为字符串,然后将其映射到XMLGregorianCalender。

我现在有两个问题:

>

  • 我在DateTimeFormail中找不到任何格式化程序,它将时间格式化为UTC偏移量?是否存在这样的东西,或者我需要定义我的格式化程序模式?

    其次,如果我能够将LocalDateTime格式化为所需的字符串格式,那么如果我仅从字符串表示创建一个XMLGregorianCalendar就足够了吗?

  • 共有1个答案

    南宫天逸
    2023-03-14

    如果时区偏移量要从JVM的默认时区派生,则像这样编码:

    LocalDateTime localDateTime = LocalDateTime.now();
    ZonedDateTime zonedDateTime = localDateTime.atZone(ZoneId.systemDefault()); // <== default
    OffsetDateTime offsetDateTime = zonedDateTime.toOffsetDateTime();
    XMLGregorianCalendar xmlGregorianCalendar = DatatypeFactory.newInstance()
            .newXMLGregorianCalendar(offsetDateTime.format(DateTimeFormatter.ISO_OFFSET_DATE_TIME));
    
    System.out.println(localDateTime);        // 2020-03-04T15:58:09.604171800
    System.out.println(zonedDateTime);        // 2020-03-04T15:58:09.604171800-05:00[America/New_York]
    System.out.println(offsetDateTime);       // 2020-03-04T15:58:09.604171800-05:00
    System.out.println(xmlGregorianCalendar); // 2020-03-04T15:58:09.604171800-05:00
    

    如果您想硬编码01:00的偏移量,请这样做:

    LocalDateTime localDateTime = LocalDateTime.now();
    OffsetDateTime offsetDateTime = localDateTime.atOffset(ZoneOffset.ofHours(1)); // <== hardcoded
    XMLGregorianCalendar xmlGregorianCalendar = DatatypeFactory.newInstance()
            .newXMLGregorianCalendar(offsetDateTime.format(DateTimeFormatter.ISO_OFFSET_DATE_TIME));
    
    System.out.println(localDateTime);        // 2020-03-04T16:00:04.437550500
    System.out.println(offsetDateTime);       // 2020-03-04T16:00:04.437550500+01:00
    System.out.println(xmlGregorianCalendar); // 2020-03-04T16:00:04.437550500+01:00
    

    或者像这样:

    LocalDateTime localDateTime = LocalDateTime.now();
    XMLGregorianCalendar xmlGregorianCalendar = DatatypeFactory.newInstance()
            .newXMLGregorianCalendar(localDateTime.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME));
    xmlGregorianCalendar.setTimezone(60); // <== hardcoded
    
    System.out.println(localDateTime);        // 2020-03-04T16:03:09.032191
    System.out.println(xmlGregorianCalendar); // 2020-03-04T16:03:09.032191+01:00
    
     类似资料:
    • 我试图弄清楚如何将LocalDateTime转换为偏移量为0的Date对象。 我使用的将LocalDateTime转换为日期的当前代码是: LocalDateTime: 转换到日期后: 是的,我看到有一个区域偏移量被传递到Instant中,但我不确定如何做我所要求的。

    • 将 LocalDateTime 转换为 LocalDateTime(以 UTC 为单位)。 我在网上搜索。但没有找到解决方案

    • 我有如下代码 每当我通过将其设置为实体来保存到我的数据库时,它会添加5:30作为偏移量

    • 我正在尝试将ISO日期时间隐藏到LocalDateTime: 这段代码起作用--它将它转换为localdate(包括offset)。但问题是当我通过日期没有偏移:2011-12-03T10:15:30- 我知道为什么我有这个例外,问题是如何将包括偏移量在内的两个日期转换为LocalDateTime?。我想避免一些字符串解析(检查字符串是否包含'+'/'-')。

    • 本文向大家介绍如何将Java LocalDateTime格式化为ISO_DATE_TIME格式,包括了如何将Java LocalDateTime格式化为ISO_DATE_TIME格式的使用技巧和注意事项,需要的朋友参考一下 首先,设置日期: 现在,将日期时间格式化为ISO_DATE_TIME格式: 示例 输出结果

    • 问题内容: 我需要在查询中将DATE值转换为带时区的TIMESTAMP,但目前我正在获取不能被EF使用的时区(欧洲/巴黎)。 例如,执行此操作时: 我目前得到此输出: 但我需要像这样: 任何想法如何做到这一点? 问题答案: 您可以将转换为,然后使用将此时间戳转换为具有时区的时间戳: