Search code examples
javajava-timedataformat

How can i convert time from milis to date with time?


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?


Solution

  • 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