2016-07-29 3 views
1

내가 명시 적으로 시간대를 추가하고 여전히 할 수있는 방법을잭슨 : 스프링 MVC (봄 부팅)와

2016-07-26T05:30:47+01:00 Europe/Paris 

에서

2016-07-26T05:30:47+01:00 

아니라에서 ZonedDateTime를 역 직렬화 할 수 시간대 ID로 ZonedDateTime을 구문 분석 그것을 deserialize?

+0

"유럽/파리"라는 용어는 모든 전환 기록, 실제 및 미래의 일광 절약 시간 규칙 및 기본 시간대 데이터의 버전을 포함하는 전체 시간대를 나타냅니다. 따라서 직렬화와 비 직렬화는 잠재적으로 "Europe/Paris"문자열뿐만 아니라이 모든 것을 전송해야합니다. 제 생각에는 모든 것을 직렬화하는 것은 좋은 생각이 아닙니다. 더 나은 성능을 보장하기 위해'ZonedDateTime'의 순간 만 직렬화하는 것으로 생각하십니까? –

답변

0

일부 필드가 선택 사항임을 나타 내기 위해 선택 섹션 ([]으로 구분)이있는 패턴을 지정하고 @JsonFormat 주석을 사용하여 해당 필드에 추가 할 수 있습니다.

예를 들어,이 클래스를 가지고 :

public class OptionalTimeZoneTest { 

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

    // getter and setter 
} 

주에게 마지막 부분 ([ VV]) : 파서가 구문 분석하려고, 그래서 존재하는 경우 [] 내부의 패턴은, 옵션 섹션입니다. 그리고 패턴 VV이 영역 ID입니다,이와

(또는 시간대의 이름 자세한 내용은 javadoc에서보세요), 두 형식을 읽을 수 있습니다 :

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

// without timezone 
String json = "{ \"date\": \"2016-07-26T05:30:47+01:00\" }"; 
OptionalTimeZoneTest value = mapper.readValue(json, OptionalTimeZoneTest.class); 
System.out.println(value.getDate()); // 2016-07-26T05:30:47+01:00 

// with timezone 
json = "{ \"date\": \"2016-07-26T05:30:47+01:00 Europe/Paris\" }"; 
value = mapper.readValue(json, OptionalTimeZoneTest.class); 
System.out.println(value.getDate()); // 2016-07-26T05:30:47+02:00[Europe/Paris] 

출력은 다음과 같습니다

2016-07-26T05 : 30 : 47 + 01 : 00
2016-07-26T05 : 30 : 47 + 02 : 00 [유럽/파리]

첫 번째 경우 출력은 2016-07-26T05:30:47+01:00입니다 (시간대가 없기 때문에 +01:00 오프셋이 적용됨).

그러나 Europe/Paris 시간대, 26/07/2016 is summer-time에서 (따라서 오프셋 +02:00이다) 때문에 두 번째의 경우에 출력은 2016-07-26T05:30:47+02:00[Europe/Paris]이다. 그리고 java.time API는 이러한 String을 구문 분석 할 때 시간대가 우선하는 방식으로 구현되었습니다.


모든 ZonedDateTime 인스턴스가 UTC로 변환하기 원하는 경우이 줄을 제거 할 수없이

mapper.configure(DeserializationFeature.ADJUST_DATES_TO_CONTEXT_TIME_ZONE, false); 

, 날짜는 UTC로 변환됩니다, 출력은 다음과 같습니다

2016-07-26T04 : 30 : 47Z [UTC]
2016-07-26T03 : 30 : 47Z [UTC]