Java JAX-WS xs:dateTime,格式为UTC和Local

时间:2016-12-07 20:12:49

标签: java xml web-services jax-ws

我正在使用JAX-WS编写Web服务。我有2个日期字段,但它们具有不同的格式。示例

<DateTimeLocal>2014-06-03T14:46:48-05:00</DateTimeLocal><!--I need the format: 2014-06-03T14:46:48 -->
<DateTimeUTC>2014-06-03T14:46:48-05:00</DateTimeUTC><!--I need the format: 2015-07-23T00:00:00Z -->

我的课程:

public class Test implements Serializable {    
    private Date dateTimeLocal;
    private Date dateTimeUTC;

    @XmlElement(name="DateTimeLocal")
    @XmlSchemaType(name = "dateTime")
    public Date getDateTimeLocal() {
        return dateTimeLocal;
    }

    public void setDateTimeLocal(Date dateTimeLocal) {
        this.dateTimeLocal = dateTimeLocal;
    }

    @XmlElement(name="DateTimeUTC")
    @XmlSchemaType(name = "dateTime")
    public Date getDateTimeUTC() {
        return dateTimeUTC;
    }

    public void setDateTimeUTC(Date dateTimeUTC) {
        this.dateTimeUTC = dateTimeUTC;
    }                    
}

有人可以帮助我吗?

2 个答案:

答案 0 :(得分:0)

我假设根据字段名称你真正说的是你需要字段dateTimeLocal来返回代表服务提供商当地时间的xs:dateTime,但是你想要dateTimeUTC表示GMT或UTC的xs:dateTime。这些不是真正的格式(如Java DateFormat),而是时区表示。

尽管如此,至少有一种方法可以做到这一点:使用java.util.Calendar及其反映给定java.util.TimeZone的相对时间的能力:

package org.example.sampleservice;

import java.io.Serializable;
import java.util.Calendar;
import java.util.Date;

import javax.xml.bind.annotation.XmlElement;

public class Test implements Serializable {

    private Date dateTimeLocal;
    private Calendar dateTimeUTC;

    @XmlElement(name="DateTimeLocal")
    public Date getDateTimeLocal() {
        return dateTimeLocal;
    }

    public void setDateTimeLocal(Date dateTimeLocal) {
        this.dateTimeLocal = dateTimeLocal;
    }

    @XmlElement(name="DateTimeUTC")
    public Calendar getDateTimeUTC() {
        return dateTimeUTC;
    }

    public void setDateTimeUTC(Calendar dateTimeUTC) {
        this.dateTimeUTC = dateTimeUTC;
    }
}

然后,在您的服务实现中(填充Test):

import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;
...    
Test result = new Test();
result.setDateTimeLocal(new Date());
Calendar zuluTime = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
result.setDateTimeUTC(zuluTime);

在美国东部时间晚上9:47左右运行,我得到:

<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
   <S:Body>
      <ns2:getTestResponse xmlns:ns2="http://sampleservice.example.org/">
         <return>
            <DateTimeLocal>2016-12-07T21:47:04.988-05:00</DateTimeLocal>
            <DateTimeUTC>2016-12-08T02:47:04.988Z</DateTimeUTC>
         </return>
      </ns2:getTestResponse>
   </S:Body>
</S:Envelope>

由于America/New_York时间是GMT减去5小时,

<DateTimeLocal>2016-12-07T21:47:04.988-05:00</DateTimeLocal>

描绘了12月7日晚上9点47分,而

<DateTimeUTC>2016-12-08T02:47:04.988Z</DateTimeUTC>

描述它实际上是格林威治标准时间(UTC或祖鲁时间)的12月8日凌晨2:47。

答案 1 :(得分:0)

感谢Scott,我的问题的例子是正确的,我使用JAXWS,然后当我测试ws时,日期是由本地时区(jvm)格式化的例子:

<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"> <S:Body> <ns2:Response xmlns:ns2="http://......"> <CreateDateTime>2014-06-03T14:46:48-05:00</CreateDateTime> <LastModifiedDateTimeUTC>2014-06-13T21:09:21Z</LastModifiedDateTimeUTC>
</ns2:Response> </S:Body> </S:Envelope>

现状我使用@XmlJavaTypeAdapter

public class Test implements Serializable {
    private DateTime dateTimeLocal
    private DateTime dateTimeUTC

    @XmlElement(name="DateTimeLocal")
    @XmlSchemaType(name = "dateTime")
    public DateTime getDateTimeLocal() {
        return dateTimeLocal;
    }   
    public void setDateTimeLocal(DateTime dateTimeLocal) {
        this.dateTimeLocal = dateTimeLocal;
    }
    @XmlElement(name="DateTimeUTC")
    @XmlSchemaType(name = "dateTime")
    public DateTime getDateTimeUTC() {
        return dateTimeUTC;
    }
    public void setDateTimeUTC(DateTime dateTimeUTC) {
        this.dateTimeUTC = dateTimeUTC;
    }
}

public class DateTimeUTCAdapter extends XmlAdapter<String, DateTime> {

    private static DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ssZ").withZone(DateTimeZone.forID("UTC"));

    @Override
    public DateTime unmarshal(String v) throws Exception {
         return formatter.parseDateTime(v);
    }

    @Override
    public String marshal(DateTime v) throws Exception {
        return formatter.print(v);
    }
}