【问题标题】:Need XMLGregorianCalendar in specific time format| Java需要特定时间格式的 XMLGregorianCalendar|爪哇
【发布时间】:2020-08-21 03:08:35
【问题描述】:
public static XMLGregorianCalendar getXMLEventTime(ZonedDateTime zonedDateTime) {
        XMLGregorianCalendar xmlGregorianCalendar = null;

            if(zonedDateTime!=null) {

                GregorianCalendar gregorianCalendar = new GregorianCalendar(); 
                gregorianCalendar.setTime(getDateFromZonedDateTime(zonedDateTime));
                xmlGregorianCalendar = DatatypeFactory.newInstance().newXMLGregorianCalendar(gregorianCalendar);
            }


        return xmlGregorianCalendar;
    }

我想以“2020-05-06T16:58:38.517+00:00”格式输出,但在 UTC 中将这个“2020-05-06T16:58:38.517Z”作为我的服务器。

当我在本地(IST 时区)运行应用程序时,我得到了正确的输出“2020-05-06T16:58:38.517+05:30”,但在 UTC 时区也无法正常工作

【问题讨论】:

  • 为什么? XMLGregorianCalendar 专门用于处理 XML 日期/时间值,XML Schema Data Types 文档特别允许 Z。实际上,canonical 格式 Z,而不是+00:00,所以XMLGregorianCalendar 正确使用了canonical 格式。它正在做它应该做的事情。
  • 我检查了源代码。没有办法让XMLGregorianCalendar 不使用Z 作为零偏移量。如果你想要+00:00,你可以使用OffsetDateTime 和自定义DateTimeFormatter
  • 我想挑战你的头衔。是什么让您认为您需要特定格式的XMLGregorianCalendarXMLGregorianCalendar 没有格式,但在您调用 toString() 时以 XML 格式打印。如果是针对 API,那么 API 的提供者应该知道这一点,并且应该接受您传递给 API 的 XMLGregorianCalendar 对象,而不用担心“格式”。如果是出于任何其他目的,则适用相同的考虑或@Andreas 的建议:使用OffsetDateTime 和自定义DateTimeFormatter
  • 顺便说一句,简单一点:GregorianCalendar gregorianCalendar = GregorianCalendar.from(zonedDateTime);

标签: java spring-boot datetime zoneddatetime xmlgregoriancalendar


【解决方案1】:

你不能。你也不应该想要。正如 Andreas 在评论中所说,带有 UTC 偏移量 0 的 XMLGregorianCalendar 必须使用 Z 打印,而不是 +00:00

建议:

  1. 停止关心。将您的 XMLGregorianCalendar 传递到您需要的任何地方,我敢打赌一切都会好起来的。
  2. 让自己从观察中得到启发,它适用于您当地的时区。只需从 UTC 中选择一个非零偏移量,您就会得到您想要的格式。例如:

        ZonedDateTime zonedDateTime = ZonedDateTime
                .of(2020, 5, 6, 16, 58, 58, 517_000_000, ZoneId.of("Etc/UTC"));
        zonedDateTime = zonedDateTime.withZoneSameInstant(ZoneOffset.ofHours(1));
        GregorianCalendar gregorianCalendar = GregorianCalendar.from(zonedDateTime);
        XMLGregorianCalendar xmlGregorianCalendar = DatatypeFactory.newInstance()
                .newXMLGregorianCalendar(gregorianCalendar);
    
        System.out.println(xmlGregorianCalendar);
    

    输出:

    2020-05-06T17:58:58.517+01:00

  3. 正如 Andreas 在评论中建议的那样,使用自定义 DateTimeFormatter 来获取所需格式的字符串(不是 XMLGregorianCalendar):

        DateTimeFormatter formatter = new DateTimeFormatterBuilder()
                .append(DateTimeFormatter.ISO_LOCAL_DATE_TIME)
                .appendPattern("xxx")
                .toFormatter();
        String formattedDateTime = zonedDateTime.format(formatter);
    
        System.out.println(formattedDateTime);
    

    2020-05-06T16:58:58.517+00:00

【讨论】:

    【解决方案2】:

    我在 XML 对象中进行了更改。

    @XmlSchemaType(name = "dateTime")
    @XmlJavaTypeAdapter(DateTimeAdapter.class)
    protected XMLGregorianCalendar eventTime;
    

    得到了预期的输出。

    我使用 XSD 进行消息 (XML) 通信。添加上述 DateTimeAdapter "2020-05-06T16:58:38.517Z" 后转换为 "2020-05-06T16:58:38.517+00.00" 参考:JAXB Date Format Example using Annotation | Java Date to XML DateTime String Conversion

    【讨论】:

    • @Andreas 提到的上述观点是正确的。我使用 XSD 进行消息(XML)通信。添加上述 DateTimeAdapter "2020-05-06T16:58:38.517Z" 后转换为 "2020-05-06T16:58:38.517+00.00" 参考:javarevisited.blogspot.com/2017/04/…
    猜你喜欢
    • 2013-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多