【发布时间】:2026-02-14 16:05:03
【问题描述】:
我没有成功为我的 JPA 应用程序设置 CET 时区,该应用程序使用 AuditingEntityListener 来增加创建/上次修改日期。
我已经尝试过的事情:
在我的 application.properties(两种组合)中:
spring.jpa.properties.hibernate.jdbc.time_zone=UTC+1
spring.jpa.properties.hibernate.jdbc.time_zone=CET
为我的 JDBC 连接添加了时区(两种组合)
spring.datasource.url=jdbc:mysql://host:3306/db?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC+1
spring.datasource.url=jdbc:mysql://host:3306/db?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=CET
添加了后期构造(应用程序级别)
@PostConstruct
void started() {
TimeZone.setDefault(TimeZone.getTimeZone("UTC+1"));
}
还尝试使用以下方法在数据库级别设置时区:
SET time_zone='+01:00';
没有成功,我错过了什么吗?
使用@createdDate 如下:
编辑
@Data
@Builder
@Entity
@EntityListeners(AuditingEntityListener.class)
@NoArgsConstructor
@AllArgsConstructor
public class OrderHistoryRecord {
@Id
@GeneratedValue
@JsonIgnore
private Long id;
@NotNull
@ManyToOne(fetch = FetchType.LAZY, targetEntity = Order.class)
@JoinColumn(name = "order_id", updatable = false)
@JsonIgnore
private Order order;
@CreatedDate
private Date date;
@Enumerated(EnumType.STRING)
private PaymentStatus paymentStatus;
@Enumerated(EnumType.STRING)
private ShipmentStatus shipmentStatus;
@Enumerated(EnumType.STRING)
private OrderHistoryRecordType type;
}
【问题讨论】:
-
您使用哪种数据类型?将所有日期存储为 iso 然后设置客户端使用它需要的任何区域不是更好吗?如果您使用部署在不同时区的应用程序会更好。
-
好吧,甚至可以设置这个吗?我添加了一个我的用例示例。
-
用现代java和
java.time.Instant代替java.util.Date怎么样?在Instant的情况下,还有关于timezone的信息。所以如果你知道你的客户在哪个时区,那么很容易转换到那个时区。不是吗?阅读更多here
标签: java spring spring-boot jdbc spring-data-jpa