簡體   English   中英

如何獲取XMLGregorianCalendar的日期

[英]How to get XMLGregorianCalendar to date

在我們的應用程序中,我們使用提供肥皂響應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轉換為日期。

無法復制您看到的數字,所以讓我給您看一下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 ,然后截斷字符串。

如果您有一個XMLGregorianCalendar實例,例如xcal,則可以通過調用以下命令獲取Date對象:

xcal.toGregorianCalendar()。getTime()

但是我不確定您是否將從那里得到毫秒,因為它們不會轉換為XMLGregorianCalendar。

查看此代碼:-

首先創建XMLGregorianCalendar對象

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

然后將其轉換為Date對象

/* java.util.Date */
Date date = xmlDate.toGregorianCalendar().getTime();
System.out.println("java.util.date :- " + date);

您可以在此處看到完整的示例

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM