Spring Boot Jackson date and timestamp Format

First of all Date.toString method generates misleading output and we should not rely on it. Simple example:

SimpleDateFormat dateToStringFormat = new SimpleDateFormat("EEE MMM dd HH:mm:ss Z yyyy", new Locale("us"));
Date parsed = dateToStringFormat.parse("Wed Mar 20 09:00:00 KST 2019");
System.out.println("Default toString: " + parsed);

dateToStringFormat.setTimeZone(TimeZone.getTimeZone("Asia/Seoul"));
System.out.println("With 'Asia/Seoul' TZ: " + dateToStringFormat.format(parsed));

dateToStringFormat.setTimeZone(TimeZone.getTimeZone("Chile/Continental"));
System.out.println("With 'Chile/Continental' TZ: " + dateToStringFormat.format(parsed));

prints:

Default toString: Wed Mar 20 01:00:00 CET 2019
With 'Asia/Seoul' TZ: Wed Mar 20 09:00:00 +0900 2019
With 'Chile/Continental' TZ: Tue Mar 19 21:00:00 -0300 2019

As you can see I parsed your example date Wed Mar 20 09:00:00 KST 2019 and print using toString method and formatted with two different timezones. So, everyone sees date combined with his timezone. Read more about:

  • Java Date toString contains a timezone… Why?
  • Parsing a java Date back from toString()

We can not define date patters in configuration like you proposed. See available Jackson configuration options here.

You can configure format using com.fasterxml.jackson.annotation.JsonFormat annotation. Since Java 8 is available we should use java.time.* classes for time related properties. Example POJO class could like this:

import com.fasterxml.jackson.annotation.JsonFormat;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.MonthDay;

public class RequestPayload {

    @JsonFormat(pattern = "MM/dd")
    private MonthDay md;

    @JsonFormat(pattern = "yyyy-MM-dd")
    private LocalDate date;

    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime dateTime;

    // getters, setters, toString
}

To make it work we need to register JavaTimeModule module:

@Bean
public Jackson2ObjectMapperBuilder objectMapperBuilder() {
    Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder();
    builder.modules(new JavaTimeModule());

    return builder;
}

If you can change your Bean properties to java.time.* classes just propagate these dates from Controller to DB. In other case see this question: Converting between java.time.LocalDateTime and java.util.Date.