簡體   English   中英

LocalDate 在持久化到 MySQL 數據庫時發生變化

[英]LocalDate changes when being persisted to MySQL database

我有一個在 Linux 機器上運行的 Java 應用程序,它從 API 檢索一些數據並將其保存到 MySQL 數據庫中。 當我嘗試將日期和時間(LocalDate,LocalTime)保存到數據庫中時,Java 和數據庫中的值不同。

例如,對於 2021 年 10 月 9 日和倫敦時間 00:00 的日期,我在數據庫中看到正確的日期是 10 月 9 日,但時間是 23:00 而不是 00:00。 我不得不提到它在從 DST 到 GMT 的小時更改之前工作。 我用於保存到數據庫中的 Java 代碼是這樣的,在對其進行調試時,值保持正確,日期為 10 月 9 日,時間為 00:00:

ZonedDateTime utcTime = fixturesList.get(i).getEvent_date();
ZoneId london = ZoneId.of("Europe/London");
ZonedDateTime dateTimeLondon = utcTime.toInstant().atZone(london);
currentMatchEntity.setDate(dateTimeLondon.toLocalDate());
currentMatchEntity.setTime(dateTimeLondon.toLocalTime());
matchesRepository.save(currentMatchEntity);

我認為 MySql 可能有錯誤的時區,所以我運行了下面的查詢,但結果似乎是正確的: 在此處輸入圖片說明

另外,我認為Linux機器可能存在一些問題,所以我運行了以下命令,但結果似乎也正確。

在此處輸入圖片說明

來自 Java 的 Hibernate 屬性:

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>

        <property name="connection.driver_class">com.mysql.cj.jdbc.Driver</property>
        <property name="connection.url">jdbc:mysql://databaseAddress/databaseName;serverTimezone=GMT</property>

        <property name="connection.pool_size">2</property>

        <property name="dialect">org.hibernate.dialect.MySQL5Dialect</property>

        <property name="show_sql">true</property>

        <property name="current_session_context_class">thread</property>


        <!-- DB schema will be updated if needed -->
        <!-- <property name="hbm2ddl.auto">update</property> -->
    </session-factory>
</hibernate-configuration>

為什么 MySQL 將時間保存為“23:00”而不是“00:00”? 為什么它用一減少小時? 誰能幫我?

11 月 10 日。可能是 DayLightSaving 問題。

通常,您應該能夠避免編寫代碼來轉換時區。 但它需要

  • 正確設置客戶端和服務器——OS 和 MySQL——
  • DATETIMETIMESTAMP之間正確選擇。

DATETIME就像為牆上的時鍾拍照。 它已經設置了時區和日光/標准時間。

TIMESTAMP以 UTC 存儲。 您輸入的內容會根據一些設置悄悄轉換為 UTC。 讀取時,它被轉換回來。

另一個人通過他的計算機從您的服務器獲取TIMESTAMP將看到與您存儲的時間不同的時間。 對於DATETIME ,你們都看到相同的字符串。

要查看您的 MySQL 服務器是如何配置的:

SHOW VARIABLES LIKE '%zone%';

如果顯示"SYSTEM" ,請查看操作系統設置以了解其含義。

注意事項:英國使用了DST有些年頭。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM