I have a class:
public class Test{
private String name;
private ZonedDateTime date1;
private ZonedDateTime date2;
and i also have a method to represent object in JSON format:
private String convertTestToJson(Test test) {
ObjectMapper mapper = new ObjectMapper();
try {
mapper.registerModule(new JavaTimeModule());
return mapper.writeValueAsString(test);
} catch (JsonProcessingException e) {
e.printStackTrace();
return null;
}
}
When i creating the object i try to sout result in the console i got rightly json format with rigtly fields but time is represent in miliseconds :
{"reportType":"Test name","date1":1615978661.832223700,"date2":1615978661.837225400}
But i want to get date in normal format like year-month-day hour-minute-second-milis but when i remove this line: mapper.registerModule(new JavaTimeModule());
I got the exception:
com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Java 8 date/time type `java.time.ZonedDateTime` not supported by default: add Module "com.fasterxml.jackson.datatype:jackson-datatype-jsr310" to enable handling
at com.fasterxml.jackson.databind.exc.InvalidDefinitionException.from(InvalidDefinitionException.java:77)
at com.fasterxml.jackson.databind.SerializerProvider.reportBadDefinition(SerializerProvider.java:1276)
at com.fasterxml.jackson.databind.ser.impl.UnsupportedTypeSerializer.serialize(UnsupportedTypeSerializer.java:35)
at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:728)
at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:770)
at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:178)
at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider._serialize(DefaultSerializerProvider.java:480)
at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:319)
at com.fasterxml.jackson.databind.ObjectMapper._writeValueAndClose(ObjectMapper.java:4487)
at com.fasterxml.jackson.databind.ObjectMapper.writeValueAsString(ObjectMapper.java:3742)
at com.mycroft.report.Report.convertReportToJson(Test.java:38)
at com.mycroft.report.Report.generateReport(Test.java:30)
at com.mycroft.Main.main(Main.java:21)
I also got in dependency :
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
<version>2.12.2</version>
</dependency>
And the question is how i can represent date in right format, no in miliseconds?
Change your class as follows:
public class Test{
private String name;
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ")
private ZonedDateTime date1;
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ")
private ZonedDateTime date2;
This should resolve your problem.
Source: Spring Data JPA - ZonedDateTime format for json serialization