从MySQL时间到Java日期的值转换不正确

从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

在我的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 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,然后在应用程序上显示它时转换为本地时间。