0
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 时区中同样不起作用

4

2 回答 2

2

你不能。你也不应该想要。正如 Andreas 在评论中所说,XMLGregorianCalendar带有 UTC 偏移量 0 的 an 必须打印为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

于 2020-05-06T16:27:40.407 回答
1

我在 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 日期格式示例 | Java 日期到 XML 日期时间字符串的转换

于 2020-05-08T09:34:26.893 回答