[FIXED] Jackson desialisiert das Datum, ignoriert die Zeit/setzt die Zeit auf 0

Ausgabe

Unten ist meine Liste von json-Objekten:

[
    {
        "Date": "2022-04-06T00:00:00"
    },
    {
        "Date": "2022-12-06T00:00:00"
    }
]

und mein POJO:

@Data
public class MyPojo {

    @JsonProperty("Date")
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd")
    private Date date;
}

Deserialisierungscode:

public <T> List<T> toObjList(String json, Class<T> className) {
        try {
            return new ObjectMapper().readValue(json, objectMapper.getTypeFactory().constructCollectionType(List.class, className));
        } catch (Exception ex) {
            log.error("Exception converting json to Object: {}", json);
            throw new AppException("Exception while converting String to Object list", ex, HttpStatus.INTERNAL_SERVER_ERROR);
        }
    }

Mein Problem ist, obwohl ich die Zeit im jsonFormatMuster weglasse, sehe ich, dass jedem Datum eine zufällige Zeit hinzugefügt wird. Ich habe die serialisierten Daten gedruckt und Folgendes war die Ausgabe:

(Datum = Freitag, 30. September, 05:30:00 Uhr IST 2022)

Ich habe versucht, ein Datum mit simleDateFormat zu analysieren, und es schien ohne die Zeit zu analysieren.

String input = "2022-09-30T00:00:00";
SimpleDateFormat parser = new SimpleDateFormat("yyyy-MM-dd");
Date date = parser.parse(input);
System.out.println(date);

Dies ergab eine erwartete Ausgabe

Freitag, 30. September, 00:00:00 Uhr IST 2022

Lösung

Vermeiden Sie veraltete Datums-/Uhrzeitklassen

Die terrible java.util.Date-Klasse wurde vor Jahren durch die modernen java.time- Klassen ersetzt, die in JSR 310 definiert sind.

Unter den vielen Fehlern in dieser Klasse ist der Name Dateeine Fehlbezeichnung. Die Klasse stellt einen Moment dar, wie er mit einem Versatz von null Stunden-Minuten-Sekunden von UTC gesehen wird. Es hat also immer eine Tageszeit plus den Offset von Null.

java.time.LocalDate

Wenn Sie einen reinen Datumswert ohne Tageszeit und ohne Offset oder Zeitzone darstellen möchten, verwenden Sie die moderne Klasse java.time.LocalDate.

Bestimmung eines Datums aus einem Moment

Wenn Sie ein java.util.DateObjekt erhalten, wandeln Sie es sofort in seinen modernen Ersatz um, java.time.Instant. Verwenden Sie die neuen Konvertierungsmethoden, die den alten Klassen hinzugefügt wurden.

Instant instant = myJavaUtilDate.toInstant() ; 

Um ein Datum zu bestimmen, müssen Sie eine Zeitzone angeben. Für jeden bestimmten Moment variiert das Datum rund um den Globus je nach Zeitzone. „Morgen“ in Asia/Tokyoist gleichzeitig „gestern“ in America/Edmonton.

ZoneId z = ZoneId.of( "Africa/Tunis" ) ;  // Specify your time zone of interest.
ZonedDateTime zdt = instant.atZone( z ) ;

Extrahieren Sie Ihren gewünschten reinen Datumswert.

LocalDate ld = zdt.toLocalDate() ; 

Vergleichen Sie LocalDateObjekte mit den Methoden isEqual, isBeforeund .isAfter

Suchen Sie, um mehr zu erfahren. All dies wurde viele Male auf Stack Overflow behandelt.


Beantwortet von –
Basil Bourque


Antwort geprüft von –
Gilberto Lyons (FixError Admin)

0 Shares:
Leave a Reply

Your email address will not be published. Required fields are marked *

You May Also Like