Je fais quelques tests pour définir UTC comme fuseau horaire par défaut pour mon application. Tout d’abord, je veux que mes valeurs datetime soient stockées avec l’UTC.
Selon VLAD MIHALCEA ( https://vladmihalcea.com/how-to-store-date-time-and-timestamps-in-utc-time-zone-with-jdbc-and-hibernate/ ) et https://moelholm.com/2016/11/09/spring-boot-controlling-timezones-with-hibernate/ J'ai défini dans mon fichier de propriétés:
spring.jpa.properties.hibernate.jdbc.time_zone= UTC
Pour tester, j'utilise une base de données h2, j'ai créé un exemple d'entité avec tout le type dateTime Java 8.
Dans ma configuration liquibase, ils sont définis comme suit:
<column name="instant" type="timestamp"/>
<column name="local_date" type="date"/>
<column name="local_time" type="time"/>
<column name="offset_time" type="time"/>
<column name="local_date_time" type="timestamp"/>
<column name="offset_date_time" type="timestamp"/>
<column name="zoned_date_time" type="timestamp"/>
Je pense que j'utilise le bon type pour tous les champs. Cela fonctionne pour tous les champs sauf "local_time" "offset_time" qui sont des types Time SQL pas timestamp.
Comme vous pouvez le constater, j'ai ajouté cette ligne à 8h39 (Paris GMT + 2) et les horodatages ont la bonne valeur UTC (06h38). MAIS "heure locale" et "heure_offensive" ont une valeur étrange ( 7h39).
Je me demande pourquoi ce comportement, si certains d’entre vous ont une idée de la raison pour laquelle mes deux champs temporels ne stockent pas les valeurs correctement.
PS: version:
Mon exemple d'entité utilise pour insérer des données:
import javax.persistence.*;
import Java.io.Serializable;
import Java.time.*;
import Java.util.Objects;
@Entity
@Table(name = "avdev_myData")
public class MyData implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequenceGenerator")
@SequenceGenerator(name = "sequenceGenerator")
private Long id;
@Column(name = "name")
private String name;
@Column(name = "instant")
private Instant instant;
@Column(name = "local_date")
private LocalDate localDate;
@Column(name = "local_time")
private LocalTime localTime;
@Column(name = "offset_time")
private OffsetTime offsetTime;
@Column(name = "local_date_time")
private LocalDateTime localDateTime;
@Column(name = "offset_date_time")
private OffsetDateTime offsetDateTime;
@Column(name = "zoned_date_time")
private ZonedDateTime zonedDateTime;
J'ai ouvert un problème dans le traqueur de bugs Hibernate et j'ai eu une réponse à mon problème.
Pour LocalTime, la transformation est relative au 1er janvier 1970, pas le jour où j'ai effectué le test. Donc, l'heure d'été n'est pas gérée.
Selon Vlad Mihalcea, nous devons utiliser LocalDateTime à la place, car nous connaissons la date et bien sûr, si la période est ou non.
il y a toute la réponse ici: https://hibernate.atlassian.net/browse/HHH-12988?focusedCommentId=103750&page=com.atlassian.jira.plugin.system.issuetabpanels%3A3. comment-103750
cordialement
Essaye:
@SpringBootApplication
public class YourApplication {
@PostConstruct
void started() {
// set JVM timezone as UTC
TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
}
}
Dans le cas où décider d'utiliser MySQL dans mon cas fonctionne correctement avec
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL57InnoDBDialect
spring.datasource.url = jdbc: mysql: // DBHOST: 3306/DBNAME? useLegacyDatetimeCode = false & serverTimezone = UTC