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:
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.