Wie speichere ich DateTime im UTC-Format mit Java 8?
Spring Boot Version 2.3.1.
Ich habe folgende Klasse:
@Data
@Entity
@NoArgsConstructor
public class CarParkEvent implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Enumerated(EnumType.STRING)
private EventType eventType;
@Column(columnDefinition = "TIMESTAMP")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime createdAt;
Nachdem ich das Ereignis lokal gespeichert habe, muss ich es an das Backend senden. Im Moment sieht das Senden von Daten folgendermaßen aus:
"createdAt": "2020-10-01T17: 15: 23.481"
Das Backend erwartet jedoch das folgende Datenformat:
"createdAt": "2020-10-01T17: 15: 23Z"
Die Hauptidee der Anwendung besteht darin , Ereignisse an das Backend zu senden .
Ich muss also genaue Daten senden, die sie erwarten.
Nach dem Betrachten der folgenden Antworten:
- Was ist dieses Datumsformat? 2011-08-12T20: 17: 46.384Z
- So konvertieren Sie LocalDateTime in ein “yyyy-MM-dd'T'HH:mm:ss'Z'”Format
Konnte nicht verstehen, wie genau ich dieses Feld lokal speichern muss?
Muss ich zu OffsetDateTimeoder wechseln ZonedDateTime?
Außerdem möchte ich die Java 8 Date Time API verwenden .
Verwenden Sie zur Steuerung der Datums- und Uhrzeiteinstellung die folgende Dienstprogrammklasse:
@Slf4j
@UtilityClass
public class TimeClock {
private LocalDateTime dateTime;
public LocalDateTime getCurrentDateTime() {
return (dateTime == null ? LocalDateTime.now() : dateTime);
}
public void setDateTime(LocalDateTime date) {
log.info("Set current date for application to: {}", date);
TimeClock.dateTime = date;
}
public void resetDateTime() {
log.info("Reset date for the application");
TimeClock.dateTime = LocalDateTime.now();
}
/**
* Different formats for current dateTime.
*/
public LocalDate getCurrentDate() {
return getCurrentDateTime().toLocalDate();
}
public LocalTime getCurrentTime() {
return getCurrentDateTime().toLocalTime();
}
}
Ich benutze es überall dort, wo das neue Datum und die neue Uhrzeit erstellt werden sollen.
Was ist die beste Strategie zum Speichern des ISO 8601- Datenzeitformats mit Java 8 und Spring Boot?
Antworten
Das Problem LocalDateTimedabei ist, dass es einfach keinen Versatz oder keine Zeitzone speichert, was bedeutet, dass Sie es nicht auf einen formatieren können String, der einen Zfür UTC bzw. einen Versatz von enthält +00:00.
Ich würde eine verwenden, ZonedDateTimedie einen Versatz hat und eine Zonen-ID und ein Format verwenden eine bestimmte DateTimeFormatter(ich weiß nicht genau, wie Ihre Anmerkung damit umgehen wird).
Hier ist ein kleines einfaches Java-Beispiel:
public static void main(String[] args) {
// get an example time (the current moment) in UTC
ZonedDateTime now = ZonedDateTime.now(ZoneOffset.UTC);
// print its toString (implicitly)
System.out.println(now);
// format it using a built-in formatter
System.out.println(now.format(DateTimeFormatter.ISO_ZONED_DATE_TIME));
// or define a formatter yourself and print the ZonedDateTime using that
System.out.println(now.format(DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ssz")));
}
Die Ausgabe dieses kleinen Beispiels war (vor einigen Sekunden):
2020-10-01T15:06:16.705916600Z
2020-10-01T15:06:16.7059166Z
2020-10-01T15:06:16Z
Ich denke, Sie können ein solches Muster in der @JSONFormatAnmerkung verwenden. Ich bin mir nicht ganz sicher, kann es aber jetzt nicht nachschlagen.