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 jsonFormat
Muster 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 Date
eine 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.Date
Objekt 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/Tokyo
ist 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 LocalDate
Objekte mit den Methoden isEqual
, isBefore
und .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)