Comment stocker DateTime au format UTC avec Java 8?
Version Spring Boot 2.3.1.
J'ai la classe suivante:
@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;
Après avoir stocké l'événement localement, je dois l'envoyer au backend. Pour l'instant, l'envoi de données ressemble à:
"createdAt": "2020-10-01T17: 15: 23.481"
Cependant, le backend attend le format de données suivant:
"createdAt": "2020-10-01T17: 15: 23Z"
L'idée principale de l'application est d' envoyer des événements au backend .
J'ai donc besoin d'envoyer les données exactes auxquelles ils s'attendent.
Après avoir examiné les réponses suivantes:
- Quel est ce format de date? 2011-08-12T20: 17: 46.384Z
- Comment convertir LocalDateTime au “yyyy-MM-dd'T'HH:mm:ss'Z'”format
Impossible de comprendre comment exactement je dois stocker ce champ localement?
Dois-je passer à OffsetDateTimeou ZonedDateTime?
De plus, je souhaite utiliser l' API Java 8 Date Time .
Pour contrôler le réglage de la date et de l'heure, utilisez la classe d'utilitaire suivante:
@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();
}
}
Je l'utilise partout où la nouvelle date-heure doit être créée.
Quelle est la meilleure stratégie pour stocker le format d'heure des données ISO 8601 avec Java 8 et Spring Boot?
Réponses
Le problème avec LocalDateTimeici est qu'il ne stocke tout simplement pas de décalage ou de fuseau horaire, ce qui signifie que vous ne pouvez pas le formater en un Stringqui contient un Zpour UTC ou un décalage de +00:00.
J'utiliserais un ZonedDateTimequi aura un décalage et un identifiant de zone et le format utilise un spécifique DateTimeFormatter(je ne sais pas exactement comment votre annotation gérera cela).
Voici un petit exemple Java simple:
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")));
}
La sortie de ce petit exemple était (il y a quelques secondes):
2020-10-01T15:06:16.705916600Z
2020-10-01T15:06:16.7059166Z
2020-10-01T15:06:16Z
Je pense que vous pouvez utiliser un tel modèle dans l' @JSONFormatannotation. Pas tout à fait sûr, mais je ne peux pas le rechercher maintenant.