2017-04-05 32 views
3

我打電話給API(使用澤西島),它返回帶有區域偏移量的日期時間。有時,數據的格式如下:傑克遜/ JavaTimeModule - 處理不同的時區偏移量格式

"2017-03-28T14:40:00+01:00" 

,有時是這種格式(我不控制這一點)

"2017-03-28T14:40:00+0100" (where the ':' in timezone offset is missing). 

我想這些元帥到java.time.ZonedDateTime對象。我在我的Jersey ObjectMapper中使用JavaTimeModule()

objectMapper.registerModule(new JavaTimeModule()); 

問題:有沒有什麼辦法讓使對象映射器具有足夠的靈活性來處理時區+01:00+0100偏移?

+0

據我所知,JavaTimeModule只能「理解」ISO格式,它需要時區中的「':'」。您可能需要編寫一個自定義(de)序列化程序。這不應該太複雜。 – assylias

回答

0

您可以指定帶有可選部分(由[]分隔)的模式,以指示偏移量可以有2種不同的格式,並使用@JsonFormat註釋將其添加到相應的字段。

我已經創建這個測試類:

public class SampleType { 

    @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss[XXX][XX]") 
    private ZonedDateTime date; 

    // getter and setter 
} 

注意的最後部分([XXX][XX]):每對[]是一個可選的部分,所以解析器嘗試來分析每一個,如果存在的話。 XXX:XX偏移時也沒有偏移(更多詳情,看看在javadoc

有了這個,這兩種格式可以讀取:

ObjectMapper mapper = new ObjectMapper(); 
mapper.registerModule(new JavaTimeModule()); 

// offset with ":" 
String json = "{ \"date\": \"2017-03-28T14:40:00+01:00\" }"; 
SampleType value = mapper.readValue(json, SampleType.class); 
System.out.println(value.getDate()); // 2017-03-28T13:40Z[UTC] 

// offset without ":" 
json = "{ \"date\": \"2017-03-28T14:40:00+0100\" }"; 
value = mapper.readValue(json, SampleType.class); 
System.out.println(value.getDate()); // 2017-03-28T13:40Z[UTC] 

注意將得到的ZonedDateTime的值轉換爲UTC:2017-03-28T13:40Z[UTC]

如果要保留原始偏移量,只需使用com.fasterxml.jackson.databind.DeserializationFeature類來配置ObjectMapper

// add this to preserve the same offset (don't convert to UTC) 
mapper.configure(DeserializationFeature.ADJUST_DATES_TO_CONTEXT_TIME_ZONE, false); 

由此,偏移被保留(值不轉換爲UTC),和上述輸出爲測試將是2017-03-28T14:40+01:00