2014-10-17 81 views
1

我有一個DateTimeXmlAdapter,我用來將Joda日期轉換爲字符串。它看起來如下:如何在日期時間結束時正確添加'Z',該日期時間由Spring MVC和JAXB編組?

public class DateTimeXmlAdapter extends XmlAdapter<String, DateTime> { 
    private static final String PATTERN = "yyyy-MM-dd'T'HH:mm:ssZ"; 
    private static final DateTimeFormatter formatter = DateTimeFormat.forPattern(PATTERN); 

    @Override 
    public DateTime unmarshal(String value) { 
     return formatter.parseDateTime(value); 
    } 

    @Override 
    public String marshal(DateTime value) { 
     return formatter.print(value); 
    } 
} 

這將導致以下字符串中的XML:

2014-10-16T18:31:57-0400 

然而,端點我送這預計在最後一個「Z」,而不是-0400 。他們建議轉換爲UTC,因此不需要發送時區信息。我感覺合理。然而,除非我從字面上說明,否則我似乎無法得到'Z'的結果。如:

private static final String PATTERN = "yyyy-MM-dd'T'HH:mm:ss'Z'"; 

下面的討論似乎表明不建議添加Z.

Validating Timestamp format yyyy-MM-dd'T'HH:mm:ssZ in java?

它試圖將其更改爲以下,但是這導致日期W/O型的 'Z'。

public class DateTimeXmlAdapter extends XmlAdapter<String, DateTime> { 
    private static final DateTimeFormatter formatter = ISODateTimeFormat.dateHourMinuteSecond().withZoneUTC(); 

    @Override 
    public DateTime unmarshal(String value) { 
     return formatter.parseDateTime(value); 
    } 

    @Override 
    public String marshal(DateTime value) { 
     return formatter.print(value); 
    } 
} 

輸出:

2014-10-17T18:50:43 

我說的端點說,他們所需要的 'Z',因爲它表明從UTC偏移量爲零。在使用Joda Time和JAXB時,最後添加'Z'的正確方法是什麼?

感謝,

馬特

回答

1

的使用方法ISODateTimeFormat.dateHourMinuteSecond()的,因爲它不輸出偏移是不恰當的(在你的這是Z = UTC + 00:00)。相反,你可以使用的方法dateTimeNoMillis(),當然你需要更改DateTime -object爲UTC偏移:

public class DateTimeXmlAdapter extends XmlAdapter<String, DateTime> { 
    private static final DateTimeFormatter formatter = 
     ISODateTimeFormat.dateTimeNoMillis().withZoneUTC(); 

    @Override 
    public DateTime unmarshal(String value) { 
     return formatter.parseDateTime(value); 
    } 

    @Override 
    public String marshal(DateTime value) { 
     return formatter.print(value); 
    } 
} 

從文檔:

返回由一個完整的格式化日期和時間沒有毫秒, 以'T'(yyyy-MM-dd'T'HH:mm:ssZZ)分隔。時區偏移量爲零,「Z」爲 ,非零時區爲「±HH:mm」。

0

隨着Z與不Z是一個已知的時區與未知的時區。看到這個問題:

Semantics of the xsd:dateTime without timezone and its conversion to Date

我建議將喬達DateTimeStringXMLGregorianCalendar這是更爲精細的時區等多個領域。然後,JAXB將負責編組(或解組)編號爲XMLGregorianCalendar

參見:

  • javax.xml.datatype.DatatypeFactory.newInstance()
  • javax.xml.datatype.DatatypeFactory.newXMLGregorianCalendar(year, month, day, hour, minute, second, millisecond, timezone) - 設置最後一個0Z