LocalDateTime , ZonedDateTime et d'Horodatage
J'ai un SpringBoot app. à l'aide de Printemps de l'Initialiseur, Tomcat intégré, Thymeleaf moteur de template, et le paquet comme un fichier JAR exécutable.
J'ai un objet de domaine avec 2 propriétés (initDate, date de fin). Je veux créer 2 convertisseurs de traiter avec mySQL DB
@Convert(converter = LocalDateTimeAttributeConverter.class)
private LocalDateTime initDate;
@Convert(converter = ZonedDateTimeAttributeConverter.class)
private ZonedDateTime endDate;
le convertisseur 1 (OK)
@Converter
public class LocalDateTimeAttributeConverter implements AttributeConverter<LocalDateTime, Timestamp> {
@Override
public Timestamp convertToDatabaseColumn(LocalDateTime localDateTime) {
return (localDateTime == null ? null : Timestamp.valueOf(localDateTime));
}
@Override
public LocalDateTime convertToEntityAttribute(Timestamp sqlTimestamp) {
return (sqlTimestamp == null ? null : sqlTimestamp.toLocalDateTime());
}
}
C'est celui que je veux créer
@Converter
public class ZonedDateTimeAttributeConverter implements AttributeConverter<ZonedDateTime, Timestamp> {
@Override
public Timestamp convertToDatabaseColumn(ZonedDateTime zoneDateTime) {
return (zoneDateTime == null ? null : Timestamp.valueOf(zoneDateTime));
}
@Override
public ZonedDateTime convertToEntityAttribute(Timestamp sqlTimestamp) {
return (sqlTimestamp == null ? null : sqlTimestamp.toZonedDateTime());
}
}
Mais je ne peux pas parce que j'ai 2 erreurs:
The method valueOf(String) in the type Timestamp is not applicable for the arguments (ZonedDateTime)
et l'Horodatage n'est pas la méthode toZonedDateTime()
et si je ne rajoute pas de convertisseur pour le ZonedDate, JPA crée un tableau avec le type varbinary(255)
Bien fuseau horaire voulez-vous? (Il semble assez cassé que vous pouvez convertir un
Timestamp
à un LocalDateTime
, mais nous y voilà.) Vous pouvez bien voulez aller via Timestamp.toInstant()
et Timestamp.from(Instant)
.
OriginalL'auteur La Carbonell | 2017-05-16
Vous devez vous connecter pour publier un commentaire.
Timestamp s'étend
Date
de fournir précision de l'ordre de la nanoseconde. NiDate
niTimestamp
sont conçus pour se référer à un fuseau horaire queZoneDateTime
.Si vous avez besoin de convertir
ZonedDateTime
->Timestamp
vous devrez supprimer le fuseau horaire/offset de l'information. E. g.et pour la conversion de
Timestamp
->ZonedDateTime
vous avez besoin de spécifier un décalage:ou fuseau horaire:
Si votre intention est de sauver
ZonedDateTime
variables dans la base de données et de préserver les différents fuseaux horaires qui y sont mentionnées, je recommande de la conception de votre base de données en conséquence. Suggestions:DATETIME
pour enregistrer unLocalDateTime
et unVARCHAR
de l'enregistrement d'un fuseau horaire, comme"Europe/Paris"
ou unSMALLINT
l'enregistrement d'un décalage en minutes.ZonedDateTime
à unString
et de les enregistrer dans unVARCHAR
colonne comme"2017-05-16T14:12:48.983682+01:00[Europe/London]"
. Vous aurez alors à analyser lors de la lecture de la base de données.OriginalL'auteur Manos Nikolaidis
Jon Skeet disait déjà:
Jon également posé la bonne question, qui fuseau horaire voulez-vous? Je l'ai deviné à
ZoneId.systemDefault()
. Évidemment un fuseau horaire différent donnera un résultat différent, donc j'espère que vous allez réfléchir à deux fois et sera en mesure de trouver le bon fuseau horaire de votre but.PS j'ai réduit l'utilisation de parenthèses depuis que je l'ai trouvé plus lisible avec de moins en moins. Vous pouvez rajouter si vous le souhaitez.
OriginalL'auteur Ole V.V.