내가 명시 적으로 시간대를 추가하고 여전히 할 수있는 방법을잭슨 : 스프링 MVC (봄 부팅)와
2016-07-26T05:30:47+01:00 Europe/Paris
에서
2016-07-26T05:30:47+01:00
아니라에서 ZonedDateTime
를 역 직렬화 할 수 시간대 ID로 ZonedDateTime을 구문 분석 그것을 deserialize?
내가 명시 적으로 시간대를 추가하고 여전히 할 수있는 방법을잭슨 : 스프링 MVC (봄 부팅)와
2016-07-26T05:30:47+01:00 Europe/Paris
에서
2016-07-26T05:30:47+01:00
아니라에서 ZonedDateTime
를 역 직렬화 할 수 시간대 ID로 ZonedDateTime을 구문 분석 그것을 deserialize?
일부 필드가 선택 사항임을 나타 내기 위해 선택 섹션 ([]
으로 구분)이있는 패턴을 지정하고 @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]
"유럽/파리"라는 용어는 모든 전환 기록, 실제 및 미래의 일광 절약 시간 규칙 및 기본 시간대 데이터의 버전을 포함하는 전체 시간대를 나타냅니다. 따라서 직렬화와 비 직렬화는 잠재적으로 "Europe/Paris"문자열뿐만 아니라이 모든 것을 전송해야합니다. 제 생각에는 모든 것을 직렬화하는 것은 좋은 생각이 아닙니다. 더 나은 성능을 보장하기 위해'ZonedDateTime'의 순간 만 직렬화하는 것으로 생각하십니까? –