【问题标题】:How to get XMLGregorianCalendar to date如何获取 XMLGregorianCalendar 日期
【发布时间】:2016-03-24 14:50:27
【问题描述】:

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

当我检查 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 转换为日期。

【问题讨论】:

  • 如何“错过”毫秒? XML 元素的小数秒值是.6,您的格式化日期以毫秒为单位显示600

标签: java xml


【解决方案1】:

无法重现您看到的数字,所以让我给您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 的毫秒值将输出为@987654335 @,而不是应有的 032

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

【讨论】:

    【解决方案2】:

    如果你有一个 XMLGregorianCalendar 的实例,比如 xcal,那么你将通过调用获得 Date 对象:

    xcal.toGregorianCalendar().getTime()

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

    【讨论】:

      【解决方案3】:

      查看此代码:-

      首先创建 XMLGregorianCalendar 对象

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

      然后将其转换为日期对象

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

      你可以看到完整的例子here

      【讨论】:

        猜你喜欢
        • 2018-12-14
        • 1970-01-01
        • 2012-06-22
        • 1970-01-01
        • 2019-11-06
        • 1970-01-01
        • 2021-06-26
        • 2019-02-04
        • 1970-01-01
        相关资源
        最近更新 更多