0

我必须获取当前日期,加上 20 年,然后将其传输到 XML 对象中。

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "XMLCommande", propOrder = {
    ...
    "dateLivSouhaitee",
   ...
})
public class XMLCommande {
   ...
   @XmlElement(name = "date_liv_souhaitee", required = true)
   @XmlSchemaType(name = "date")
   protected XMLGregorianCalendar dateLivSouhaitee;
   ...
}

没有指定日期格式,都是默认的:

XMLCommande xmlMessage = new XMLCommande(); 

GregorianCalendar gregorianCalendar = new GregorianCalendar();
gregorianCalendar.add(Calendar.YEAR, 20);
ligne.setDateLivSouhaitee(DatatypeFactory.newInstance().newXMLGregorianCalendar(gregorianCalendar2));

问题是,出于某种未知原因,有时我在日期末尾有一个“Z”,但有时没有:

<date_liv_souhaitee>2041-05-26Z</date_liv_souhaitee>
<date_liv_souhaitee>2041-05-26+02:00</date_liv_souhaitee>

这是同一台服务器,为什么有时我的 Z 带有“+02:00”而有时却没有?如何强制格式始终为:

<date_liv_souhaitee>2041-05-26+02:00</date_liv_souhaitee>
4

2 回答 2

3

Z日期时间字符串中的 是零时区偏移的时区指示符。它代表 Zulu 并指定Etc/UTC时区(时区偏移量为+00:00小时)。

在另一种情况下,您+02:00在日期时间字符串中添加了时区偏移量,即 UTC 中的相应日期时间将是给定的日期时间减去 2 小时。您可以将 UTC 日期时间转换为具有+02:00时区偏移量的日期时间,例如

import java.time.LocalDate;
import java.time.ZoneOffset;
import java.time.ZonedDateTime;
import java.util.GregorianCalendar;

import javax.xml.datatype.DatatypeConfigurationException;
import javax.xml.datatype.DatatypeFactory;
import javax.xml.datatype.XMLGregorianCalendar;

public class Main {
    public static void main(String[] args) throws DatatypeConfigurationException {
        ZonedDateTime zdtUtc = LocalDate.of(2041, 5, 26).atStartOfDay(ZoneOffset.UTC);
        System.out.println(zdtUtc);
        ZonedDateTime zdtOffsetTwoHrs = zdtUtc.withZoneSameInstant(ZoneOffset.of("+02:00"));
        System.out.println(zdtOffsetTwoHrs);
        GregorianCalendar gregorianCalendar = GregorianCalendar.from(zdtOffsetTwoHrs);
        XMLGregorianCalendar xmlGregorianCalendar = DatatypeFactory.newInstance()
                .newXMLGregorianCalendar(gregorianCalendar);
        System.out.println(xmlGregorianCalendar);
    }
}

输出:

2041-05-26T00:00Z
2041-05-26T02:00+02:00
2041-05-26T02:00:00.000+02:00
于 2021-05-26T16:47:00.800 回答
0

为什么我有时会得到 Z,有时会得到 +02:00?

如果两者都来自GregorianCalendar使用无参数构造函数创建 a 并将其转换为XMLGregorianCalendar,那么最好的解释是有人正在修改您的 JVM 的默认时区。您自己的程序的一部分可能会执行此操作,或者运行在同一 JVM 中的其他程序可能会执行此操作。展示:

    TimeZone.setDefault(TimeZone.getTimeZone(ZoneId.of("Europe/Paris")));
    GregorianCalendar gc = new GregorianCalendar();
    System.out.println(DatatypeFactory.newInstance().newXMLGregorianCalendar(gc));
    
    TimeZone.setDefault(TimeZone.getTimeZone(ZoneOffset.UTC));
    gc = new GregorianCalendar();
    System.out.println(DatatypeFactory.newInstance().newXMLGregorianCalendar(gc));

这些代码行的输出是:

2021-05-26T19:41:29.744+02:00
2021-05-26T17:41:29.776Z

new GregorianCalendar()创建一个在创建GregorianCalendar时具有 JVM 的默认时区的。Z正如 Arvind Kumar Avinash 已经解释的那样,与 UTC 的偏移量 0 是按照 ISO 8601 标准呈现的。

如何始终强制 +02:00?

我建议您使用现代 Java 日期和时间 API java.time 进行日期工作。该类OffsetDateTime表示具有 UTC 偏移量的日期和时间,因此只需将偏移量设置为 +2。

    OffsetDateTime now = OffsetDateTime.now(ZoneOffset.ofHours(2));
    OffsetDateTime in20Years = now.plusYears(20);
    String dateStringWithOffset0200 = in20Years.format(DateTimeFormatter.ISO_OFFSET_DATE);
    System.out.println(dateStringWithOffset0200);

2041-05-26+02:00

如果你确实需要一个XMLGregorianCalendar,从我们刚刚得到的字符串构建一个:

    XMLGregorianCalendar xmlgc = DatatypeFactory.newInstance()
            .newXMLGregorianCalendar(dateStringWithOffset0200);
    System.out.println(xmlgc);

2041-05-26+02:00

链接

于 2021-05-26T17:45:29.443 回答