2012-11-28 17 views
7

Tôi đang phát triển một khách hàng sang dịch vụ web giới thiệu (.wsdl), yêu cầu định dạng yyyy-MM-dd cho 1 trên tham số yêu cầu, tuy nhiên được tạo tự động POJOS dựa trên .wsdl tạo thuộc tính date là Type XMLGregorianCalendar.từ XMLGregorianCalendar sang Ngày/Lịch thêm thời gian/không mong muốn


Vấn đề của tôi là không chuyển đổi đến hoặc từ XMLGregorianCalendar thấy tiện ích của tôi dưới đây:

public static XMLGregorianCalendar toXMLGregorianCalendar(Calendar c){ 
GregorianCalendar gc = new GregorianCalendar(); 
gc.setTimeInMillis(c.getTimeInMillis()); 
XMLGregorianCalendar xc= null; 
try { 
    xc = DatatypeFactory.newInstance().newXMLGregorianCalendar(gc); 
} catch (DatatypeConfigurationException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} 
return xc; 
} 

Vấn đề của tôi là đi từ XMLGregorianCalendar to Date/Lịch cho biết thêm thêm thời gian/dữ liệu không mong muốn vào yyyy-MM-dd của tôi khi gọi calendar.getTime();

Trong một đoạn mã đặc biệt tôi cần phải đi từ XMLGregorianCalendar to Date

if (repairOrderType.getCloseDate() != null) { 

       LOG.debug("ServiceHistoryMapper, processRepairOrders() , repairOrderType.getCloseDate() BEFORE:" 
         + repairOrderType.getCloseDate()); 
       String date = repairOrderType.getCloseDate().getYear() + "-" 
         + repairOrderType.getCloseDate().getMonth() + "-" 
         + repairOrderType.getCloseDate().getDay(); 

       //Approach #1, trying to remove hour,minute,sec values by calendar.clear() method , not successful 
       Calendar calendar = Calendar.getInstance(); 
       calendar.set(repairOrderType.getCloseDate().getYear(), 
         repairOrderType.getCloseDate().getMonth(), 
         repairOrderType.getCloseDate().getDay()); 
       calendar.clear(Calendar.HOUR); 
       calendar.clear(Calendar.MINUTE); 
       calendar.clear(Calendar.SECOND); 
       calendar.clear(Calendar.MILLISECOND); 



       /*Approach#2 , trying to remove hour,minute,sec values using SimpleDateFormat , 
       * also not successful. SimpleDateFormat or DateFormat are use to format String output NOT remove internal data 
       * 
       DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); 
       Calendar calendar = formatter.getCalendar(); 
       calendar.set(repairOrderType.getCloseDate().getYear(), 
       repairOrderType.getCloseDate().getMonth(), 
       repairOrderType.getCloseDate().getDay()); 
       */ 

       LOG.debug("ServiceHistoryMapper, processRepairOrders() , repairOrderType.getCloseDate() AFTER:" 
         + calendar.getTime()); 
       repairOrder.setCloseDate(calendar.getTime()); 

      } 

Output:

27-Nov-2012 18: 10: 39,743 DEBUG com.tms.owners.integration. nsh.mapping.ServiceHistoryMapper - ServiceHistoryMapper, processRepairOrders(), repairOrderType.getCloseDate() TRƯỚC: 2012-04-30

27-Nov-2012 18: 10: 51,413 DEBUG com.tms.owners.integration.nsh .bản đồ ing.ServiceHistoryMapper - ServiceHistoryMapper, processRepairOrders(), repairOrderType.getCloseDate() SAU: Wed Tháng Năm 30 18:00:00 PDT năm 2012

Như bạn thấy ở trên TRƯỚC ngày là TRƯỚC: 2012/04/30 và SAU ngày là ngày 30 tháng 5 18:00:00 PDT 2012 với giờ không mong muốn "18:00:00 PDT".


Dưới đây là yêu cầu XML thực tế của tôi gửi đến các dịch vụ:

<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"> 
    <S:Body> 
     <ns4:VehicleServiceHistoryDetails 
      xmlns="urn:tms.toyota.com/Components" xmlns:ns2="urn://esb.ari.xxxxxx.com/2008/12/10/schemas/common/Customer" 
      xmlns:ns3="urn:incentives.ari.xxxxxx.com/StandardHeader" 
      xmlns:ns4="urn://esb.ari.xxxxxx.com/2008/12/10/schemas/History" 
      xmlns:ns5="http://ice.ari.xxxxxx.com/EMF" xmlns:ns6="urn:ari.xxxxxx.com/rtmheader"> 
      <ns5:ApplicationArea> 
       <ns5:CreationDateTime>2012-11-27T18:11:23.071-08:00 
       </ns5:CreationDateTime> 
       <ns5:Sender /> 
       <ns5:UserArea /> 
      </ns5:ApplicationArea> 
      <ns4:VehicleServiceHistoryDataArea> 
       <ns4:VehicleServiceHistoryHeader> 
        <ns3:TimeStamp>2012-11-27T18:11:23.071-08:00</ns3:TimeStamp> 
        <ns3:SourceSystem>TOO</ns3:SourceSystem> 
        <ns4:SourceKey>TOY1TWXE</ns4:SourceKey> 
       </ns4:VehicleServiceHistoryHeader> 
       <ns4:VehicleServiceHistory> 
        <ns4:VIN>XXXXXXXXXXXXXXXX</ns4:VIN> 
        <ns4:RepairOrder> 
         <ns2:RepairOrderDealer> 
          <DealerNumber>29059</DealerNumber> 
         </ns2:RepairOrderDealer> 
         <ns2:RepairOrderNumber>0088745</ns2:RepairOrderNumber> 
         <ns2:CloseDate>2012-05-30-07:00</ns2:CloseDate> 
        </ns4:RepairOrder> 
       </ns4:VehicleServiceHistory> 
      </ns4:VehicleServiceHistoryDataArea> 
     </ns4:VehicleServiceHistoryDetails> 
    </S:Body> 
</S:Envelope> 

Bạn có thể nhìn thấy trong xml yêu cầu trong 2012-05-30-07: 00 mà thêm "-07: 00 "dữ liệu được thêm vào tôi chỉ muốn 2012-05-30.

Cảm ơn

Trả lời

5

Các trong bối cảnh của XML kiểu dữ liệu các XMLGregorianCalendar được tạo ra thông qua phương pháp nhà máy ở javax.xml.datatype.DatatypeFactory mà dường như có một phương pháp gọi là newXMLGregorianCalendarDate (int year, int tháng, int ngày, int múi giờ);


Vì vậy, tôi đã tạo ra một phương pháp hữu ích:

public static XMLGregorianCalendar toXMLGregorianCalendarDateOnly(Calendar c){ 
    GregorianCalendar gc = new GregorianCalendar(); 
    gc.setTimeInMillis(c.getTimeInMillis()); 
    XMLGregorianCalendar xc= null; 
    try { 
     xc = DatatypeFactory.newInstance().newXMLGregorianCalendarDate(gc.get(Calendar.YEAR),Calendar.MONTH,Calendar.DAY_OF_MONTH,DatatypeConstants.FIELD_UNDEFINED); 
    } catch (DatatypeConfigurationException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    return xc; 
    } 

Vấn đề này được giải quyết bây giờ, chúng tôi đang nhận được mong muốn yyyy-MM-đđ.

+1

Mã này sai. Bạn chỉ đang thiết lập năm –

2

Bạn cũng có thể viết nó một cách sau đó là dễ đọc hơn:

GregorianCalendar gc = new GregorianCalendar(); 
gc.setTimeInMillis(c.getTimeInMillis()); 

XMLGregorianCalendar calendar = DatatypeFactory.newInstance().newXMLGregorianCalendar(gc); 
calendar.setMillisecond(DatatypeConstants.FIELD_UNDEFINED); 
calendar.setTimezone(DatatypeConstants.FIELD_UNDEFINED); 
0

tôi đã sử dụng mã dưới đây để giải quyết cùng một vấn đề.

public static XMLGregorianCalendar toXMLGregorianCalendarWithoutTimeStamp(String date) { 
     Date mDate = null; 
     GregorianCalendar cal = new GregorianCalendar(); 
     XMLGregorianCalendar xmlGregorianCalendar; 
     DateFormat df = new SimpleDateFormat("dd-MM-yyyy"); 
     try { 
      mDate = df.parse(date); 
      cal.setTime(mDate); 
      xmlGregorianCalendar = DatatypeFactory.newInstance() 
        .newXMLGregorianCalendarDate(cal.get(Calendar.YEAR), 
          cal.get(Calendar.MONTH) + 1, 
          cal.get(Calendar.DAY_OF_MONTH), 
          DatatypeConstants.FIELD_UNDEFINED); 
      return xmlGregorianCalendar; 

     } catch (DatatypeConfigurationException e) { 
      LOGGER.error("Error in getCustomerCDRResponse Date Formate Type Configuartion :: " + e); 
     } catch (ParseException e) { 
      LOGGER.error("Error in getCustomerCDRResponse Date Parsing :: " + e); 
     } 
     return null; 
    } 
0

dùng thử.

Date dob=null; 
    DateFormat df=new SimpleDateFormat("dd/MM/yyyy"); 
    dob=df.parse("10/02/2014 11:15:00"); 
    GregorianCalendar cal = new GregorianCalendar(); 

    cal.setTime(dob); 
XMLGregorianCalendar xmlDate3 = DatatypeFactory.newInstance().newXMLGregorianCalendarDate(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH)+1, cal.get(Calendar.DAY_OF_MONTH),DatatypeConstants.FIELD_UNDEFINED); 
System.out.println(xmlDate3); 
Các vấn đề liên quan