Jackson @JsonFormat 설정 날짜를 하루 미만으로 설정
저는 Spring Date Rest with Spring Boot을 프로젝트에서 사용하고 있습니다.이 프로젝트에는 오브젝트가 있으며, 저는 @JsonFormat 주석을 사용하여 Json으로부터 수신되는 날짜 필드의 형식을 지정했습니다.Date 필드의 형식은 "dd/MM/yyy"입니다.Json에게 값 "08/07/1980"을 보내면 Jackson은 값 "07/07/1980"으로 변환합니다.
문제는 @JsonFormat이 날짜를 하루 적게 설정한다는 것입니다.
이것은 나의 소스 코드입니다.
@Temporal(TemporalType.DATE)
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd/MM/yyyy", locale = "pt-BR", timezone = "UTC")
private Date birthDate;
감사해요.
이 솔루션을 사용해 주세요.이 솔루션은 제 솔루션보다 효과적이고 최신입니다.https://stackoverflow.com/a/45456037/4886918
@Benjamin Lucidarme 감사합니다.
다음 방법으로 문제를 해결했습니다.
@Temporal(TemporalType.DATE)
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd/MM/yyyy", locale = "pt-BR", timezone = "Brazil/East")
private Date birthDate;
시간대를 '브라질/동부' 또는 '아메리카/사오_폴로'로 변경하여 현재 작업하고 있습니다.
감사해요.
@William의 답변은 유효하지만 대신 다음 행을 application.properties 파일에 추가해야 합니다.
spring.jackson.time-zone=Brazil/East
spring.jackson.locale=pt-BR
이 방법으로 타임존과 로케일을 1회만 지정하면 어플리케이션의 모든 날짜에 적용됩니다.
세팅으로 하겠습니다.ObjectMapper
표준 시간대를 기본 JVM 표준 시간대로 지정합니다.
ObjectMapper objectMapper = new ObjectMapper();
//Set default time zone as JVM timezone due to one day difference between original date and formatted date.
objectMapper.setTimeZone(TimeZone.getDefault());
서버 환경에서 어떤 시간대가 사용되는지 모르는 경우에는 이 솔루션이 더 좋습니다.
인spring-boot
기본값을 재정의할 수 있는 환경JacksonAutoConfiguration
:
@Bean
ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) {
return builder.createXmlMapper(false)
// Set timezone for JSON serialization as system timezone
.timeZone(TimeZone.getDefault())
.build();
}
양쪽(클라이언트 - 서버)에서 다음과 같이 날짜 파일에 주석을 추가합니다.
@JsonDeserialize(using = JsonDateDeserializer.class)
@JsonSerialize(using = JsonDateSerializer.class)
private Date birthDate;
또, 양쪽에서, 시리얼화와 역시리얼화를 위한 실장을 실시합니다.
public class JsonDateSerializer extends JsonSerializer<Date> {
SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy");
@Override
public void serialize(final Date date, final JsonGenerator gen, final SerializerProvider provider) throws IOException, JsonProcessingException {
String dateString = format.format(date);
gen.writeString(dateString);
}
}
public class JsonDateDeserializer extends JsonDeserializer<Date> {
SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy");
@Override
public Date deserialize(final JsonParser jp, final DeserializationContext ctxt) throws IOException, JsonProcessingException {
if (jp.getCurrentToken().equals(JsonToken.VALUE_STRING)) {
try {
Date date = format.parse(jp.getText().toString());
return date;
} catch (ParseException e) {
//e.printStackTrace();
}
}
return null;
}
}
나도 비슷한 문제에 직면했다.이 질문에 추가된 답변은 모두 위의 질문에 대한 답변이라고 생각합니다.제 솔루션은 문제를 설명하고 일반적인 해결책을 제공합니다.
같은 시간대에 2개의 다른 시간대를 사용하는 경우 이 문제가 발생할 수 있습니다.Date
할 때new Date()
타임존을 명시적으로 지정하지 않는 한 기본 타임존이 사용됩니다.코드 스니펫으로 설명드리겠습니다(인도에 있으며 현재 날짜는 (2021년 9월 5일, IST 오전 12시)).
// 09/05/2021 00:00:00 IST
Date birthDate = new Date();
위에서 설정했을 경우birthDate
JsonFormat을 사용하여 모델화 및 시리얼화되는 타이밍에 대해 설명합니다.기본적으로는 JsonFormat은 UTC 시간대를 사용합니다.
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd/MM/yyyy")
private Date birthDate;
시리얼화를 실시하면,08/05/2021
,것은 아니다.09/05/2021
.
시간대로 날짜를 쓸 수 있게 해주세요08/05/2021 UTC
,그리고.09/05/2021 IST
.
나도 데이트에 시간을 좀 더 줘.08/05/2021 18:30:00 UTC
,그리고.09/05/2021 00:00:00 IST
.
날짜가 맞지만 시간대가 다르면 왜 이런 일이 일어나는지 알 수 있습니다.이 문제를 해결하는 방법은 두 가지가 있습니다.
- 동일한 시간대 사용
- 날짜를 일련화하는 동안 시간과 시간대를 추가합니다.맘에 들다
08/05/2021 18:30:00 UTC
, , , , 입니다.09/05/2021 00:00:00 IST
언급URL : https://stackoverflow.com/questions/31822877/jackson-jsonformat-set-date-with-one-day-less
'source' 카테고리의 다른 글
ASP.NET MVC 및 Ajax, 동시 요청? (0) | 2023.03.15 |
---|---|
/wp-admin/install.php를 방문하지 않고 bash 쉘을 사용하여 WordPress를 설치하시겠습니까? (0) | 2023.03.15 |
spring-boot-starter-test with JUnit 5 (0) | 2023.03.15 |
angularjs - ng-src 내에서 {{}} 바인딩을 사용하지만 ng-src가 로드되지 않음 (0) | 2023.03.15 |
spring.cloud.config.enabled를 통해 스프링 클라우드 구성을 해제할 수 없음: false (0) | 2023.03.10 |