source

Jackson @JsonFormat 설정 날짜를 하루 미만으로 설정

factcode 2023. 3. 15. 19:57
반응형

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();

위에서 설정했을 경우birthDateJsonFormat을 사용하여 모델화 및 시리얼화되는 타이밍에 대해 설명합니다.기본적으로는 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.
날짜가 맞지만 시간대가 다르면 왜 이런 일이 일어나는지 알 수 있습니다.이 문제를 해결하는 방법은 두 가지가 있습니다.

  1. 동일한 시간대 사용
  2. 날짜를 일련화하는 동안 시간과 시간대를 추가합니다.맘에 들다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

반응형