从MySQL时间到Java日期的值转换不正确
在我的MySQL数据库中,我有一个包含三列的表,如下所示从MySQL时间到Java日期的值转换不正确,java,mysql,spring-boot,jpa,Java,Mysql,Spring Boot,Jpa,在我的MySQL数据库中,我有一个包含三列的表,如下所示 id | name | notification_time ----------------- 1 | name1 | 00:30:00 2 | name2 | 01:30:00 3 | name3 | 01:00:00 通知时间是时间的数据类型 在我的Spring boot应用程序中,为我拥有的表建模 @Entity @Table(name = "table") public class TableEntity implemen
id | name | notification_time
-----------------
1 | name1 | 00:30:00
2 | name2 | 01:30:00
3 | name3 | 01:00:00
通知时间是时间的数据类型
在我的Spring boot应用程序中,为我拥有的表建模
@Entity
@Table(name = "table")
public class TableEntity implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Integer id;
@Column(name = "name")
private String name;
@Column(name = "notification_time")
@Temporal(TemporalType.TIME)
private Date notificationTime;
要检索这些值,我只需通过我的存储库检索所有条目
tableRepository.findAll();
当我从数据库中检索通知时间时,我看到的每个时间的值是
19:30:00
20:30:00
20:00:00
因此,它似乎从我的表中的值中抵消了时间,但19小时?我希望保留表中的值(即00:30:00、01:30:00、01:00:00)。这种行为是否有原因,以及纠正这种情况的方法?发生的情况是,日期以UTC的形式存储到MSSQL中。这通常是可取的,因为当从多个区域运行应用程序实例时,如果一个时区的LocalDateTime为下午6点,另一个时区的LocalDateTime为下午7点,而另一个时区的LocalDateTime为晚上8点,则不希望在数据库中看到三个晚上7点的时间。如果您有理由希望查看本地时间,那么您可以在Java中指定一个区域,从时间字段中减去本地时间和utc时间之间的小时差,或者在需要执行SELECT查询时转换数据库中的数据 假设您知道您的本地时区是美国东部,您可以在Java中执行以下操作:
timeNow.setHours(LocalDateTime.now().getHours() - ChronoUnit.HOURS.between(LocalDateTime.now(), LocalDateTime.now(ZoneOffset.UTC)));
或者类似于SQL中的内容:
SELECT CONVERT(TIME, a_time AT TIME ZONE 'US Eastern Standard Time') FROM
schema.your_table;
我绝对不会使用Java impl,只是举个例子以防万一。你的应用程序和MySQL数据库运行在不同的时区。这个栏目是什么类型的<代码>日期时间或
时间戳
?该列的数据类型是您的应用程序正在哪个时区运行的时间
?你的数据库在哪一个时区?我想你应该考虑5个小时(区)的差异而不是19个小时。作为一个经验法则,我总是把我的数据库时区保留到UTC,然后在应用程序上显示它时转换为本地时间。