如何生成XMLGregorianCalendar时间为UTC

时间:2017-08-03 21:21:02

标签: java utc xmlgregoriancalendar

我想创建一个具有以下特征的XMLGregorianCalendar

  • 仅限时间
  • UTC时区(末尾附加“Z”)

所以我希望将日期打印为: 18:00:00Z XML Date)。

元素是xsd:time,我希望时间在XML中显示如下。

<time>18:00:00Z</time>

但我得到以下内容: 21:00:00 + 0000 。我在-3偏移,结果是我的偏移计算。

为什么我的代码有问题?

protected XMLGregorianCalendar timeUTC() throws Exception {
    Date date = new Date();
    DateFormat df = new SimpleDateFormat("HH:mm:ssZZ");
    df.setTimeZone(TimeZone.getTimeZone("UTC"));
    String dateS = df.format(date);
    return DatatypeFactory.newInstance().newXMLGregorianCalendar(dateS);
}

2 个答案:

答案 0 :(得分:2)

要获得您已提及的输出(18:00:00Z),您必须将XMLGregorianCalendar的timeZone偏移设置为0(setTimezone(0))才能显示Z 。您可以使用以下内容:

protected XMLGregorianCalendar timeUTC() throws DatatypeConfigurationException {

        SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");
        dateFormat.setTimeZone(TimeZone.getTimeZone(ZoneOffset.UTC));

        XMLGregorianCalendar xmlcal = DatatypeFactory.newInstance()
            .newXMLGregorianCalendar(
                dateFormat.format(new Date()));
        xmlcal.setTimezone(0);

        return xmlcal;
    }

如果您想要完整的DateTime,那么:

protected XMLGregorianCalendar timeUTC() throws DatatypeConfigurationException {
        return DatatypeFactory.newInstance()
            .newXMLGregorianCalendar(
                (GregorianCalendar)GregorianCalendar.getInstance(TimeZone.getTimeZone(ZoneOffset.UTC)));
    }

输出应该是这样的:2017-08-04T08:48:37.124Z

答案 1 :(得分:1)

Adding 'Z' at the end of he pattern will do the job.

DateTimeFormat.forPattern("HH:mm:ss'Z'");