如何获得XMLGregorianCalendar到目前为止

时间:2016-03-24 14:50:28

标签: java xml

在我们的应用程序中,我们使用一个提供soap响应XML(文档样式)的Web服务。

当我检查只是转换界面的Web服务提供商时 响应节点值(SubscriberContextIdentifier),它们从不同的源获取到MemberEffectiveTimestamp节点,并提供与我们相同的响应。

         <SubscriberContextIdentifier>20152201846166</SubscriberContextIdentifier>   

转换为以下xml

中的MemberEffectiveTimestamp节点

响应XML示例:

                <ct:PersonName>
                <ct:FirstName>MICHAEL</ct:FirstName>
                <ct:Middle1Name>J</ct:Middle1Name>
                <ct:LastName>ROSSMAN</ct:LastName>
        </ct:PersonName>
        <ct:BirthDate>1979-09-10</ct:BirthDate>
        <ct:GenderCode>M</ct:GenderCode>
        <ct:MaritalStatusCode>SNGL</ct:MaritalStatusCode>
        <ct:MemberSequenceNumber>1</ct:MemberSequenceNumber>
        <ct:SmokerStatusCode>UNK</ct:SmokerStatusCode>
        <ct:MemberEffectiveTimestamp>2015-08-08T18:46:16.6Z</ct:MemberEffectiveTimestamp>
        <ct:TimeTracking>
                <ct:UpdateTimestamp>2014-11-08T23:36:48.6</ct:UpdateTimestamp>
                <ct:AsOfDate>2014-11-08</ct:AsOfDate>
        </ct:TimeTracking>

问题:

我需要取回第一个提供商提供给接口团队的值,即来自MemberEffectiveTimestamp的SubscriberContextIdentifier

现有代码:

  if (member.getMemberEffectiveTimestamp()!= null) {
        final EntityIdTypeWithChangedAtt.IdValueType idValueType = factory
                .createEntityIdTypeWithChangedAttIdValueType();
        java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("yyyyDDDHHmmssS");
        System.out.println("Memeber Effective Timestamp -->"+member.getMemberEffectiveTimestamp().toGregorianCalendar().getTime());
        System.out.println("Memeber Effective Timestamp after conversion -->"+sdf.format(member.getMemberEffectiveTimestamp().toGregorianCalendar().getTime()));
        idValueType.setValue(sdf.format(member.getMemberEffectiveTimestamp().toGregorianCalendar().getTime()));
        idValueType.setName("SubscriberContextIdentifier");
        idValueLt.add(idValueType);
    }

XSD文件:

   <xsd:element name="MemberEffectiveTimestamp" type="bt:Timestamp"
         minOccurs="0"/>
  <xsd:simpleType name="Timestamp">
    <xsd:restriction base="xsd:dateTime"/>

输出:

  Memeber Effective Timestamp -->Sat Aug 08 18:46:16 EDT 2015
  Memeber Effective Timestamp after conversion -->201588184616600

当我从响应xml中检索值时,如果比较毫秒值,则会错过。

现在任何人都可以将XMLGregorianCalendar转换为日期。

3 个答案:

答案 0 :(得分:5)

无法重现您看到的数字,所以让我给您MCVE(最小,完整和可验证的例子):

XMLGregorianCalendar xcal = DatatypeFactory.newInstance()
                                           .newXMLGregorianCalendar("2015-08-08T18:46:16.6Z");
Date date = xcal.toGregorianCalendar().getTime();
System.out.println(xcal);
System.out.println(date);
System.out.println(new SimpleDateFormat("yyyyDDDHHmmssSSS").format(date));

打印:

2015-08-08T18:46:16.6Z
Sat Aug 08 14:46:16 EDT 2015
2015220144616600

正如您所看到的,时间18:46:16.6Z实际上是14:46:16 EDT,而不是18:46:16 EDT

此外,当DDD确实88时,您显示的220值为2015 88 18 46 16 600 <-- from question 2015 220 14 46 16 600 <-- from this answer

88

为什么你得到S,以及为什么它不是零前缀,我不知道。

另请注意,SSS毫秒值,而不是小数秒值,应始终为.032,否则为32的毫秒值}将输出为032,而不是SimpleDateFormat

SSS无法输出十分之一秒,只能输出毫秒。要获得十分之一秒,请使用#ifdef,然后截断字符串。

答案 1 :(得分:0)

如果您有XMLGregorianCalendar的实例,比如xcal,那么您将通过调用获取Date对象:

  

xcal.toGregorianCalendar()。的getTime()

但是我不确定你是否会从那里得到毫秒,因为它们不会被转换为XMLGregorianCalendar。

答案 2 :(得分:0)

查看此代码: -

首先创建XMLGregorianCalendar对象

 .o-or-divider:after, .o-or-divider:before {
   position: absolute;
   content: "";
   display: block;
   padding: 55px 0;
   border-left: 1px solid #7dc246;
   left: 50%;
}

然后将其转换为日期对象

XMLGregorianCalendar xmlDate = null;
GregorianCalendar gc = new GregorianCalendar();
gc.setTime(new Date()); 
try{
   xmlDate = DatatypeFactory.newInstance().newXMLGregorianCalendar(gc);
}catch(Exception e){
   e.printStackTrace();
} 

您可以看到完整的示例here