Skip to content
On this page

理解 MySQL 中的時區

背景知識:日期時間、時間戳和時區

在大多數情況下,日期和時間指的是本地時區的當前時間。例如,當你看到 "2024-06-15 12:00:00" 時,意味着現在是 2024 年 6 月 15 日 12:00:00 在你的本地時區。

然而,當你的應用爲不同時區的用戶提供服務時,你需要考慮時區的問題。例如,如果一個紐約的用戶在 "2024-06-15 12:00:00" 創建了一條記錄,那麼這條記錄是在紐約時區的 12:00:00 創建的。如果另一個在北京的用戶查看這條記錄,時間應該被轉換爲北京時區。

總之,日期時間是本地時區的時間,你應該向日期時間添加時區信息,以使其在全球範圍內可用。

另一方面,時間戳是自 1970 年 1 月 1 日 00:00:00 UTC 起經過的秒數。時間戳是與時區無關的,無論你身在何處,它始終保持不變。

MySQL 中的日期時間數據類型

在 MySQL 中,有幾種日期時間數據類型,但最重要的是 DATETIMETIMESTAMP

  • DATETIME:日期和時間,格式爲 YYYY-MM-DD HH:MM:SS。它存儲日期和時間,因此必須考慮時區。
  • TIMESTAMP:時間戳,它存儲時間戳數字,是與時區無關的。但當您寫入或讀取時間戳時,會進行時區轉換。

MySQL 中的時區

MySQL 有一個系統變量 time_zone 用於設置時區。您可以通過以下方式設置時區:

  1. 在配置文件 my.cnf 中設置時區:

    ini
    [mysqld]
    default-time-zone = '+00:00'
  2. 在 MySQL 客戶端中設置時區:

    sql
    SET time_zone = '+00:00';
  3. 在連接字符串中設置時區:

    sql
    mysql -u root -p --default-time-zone='+00:00'

如果您沒有設置時區,MySQL 將默認使用系統時區。

在應用程序中設置時區

當您在應用程序中使用 MySQL 時,應該在應用程序中設置時區。例如,在 Node.js 中,您可以這樣設置時區:

javascript
const mysql = require('mysql2');
const conn = mysql.createConnection({
    host: 'localhost',
    user: 'root',
    password: 'password',
    database: 'test',
    timezone: '+00:00'
});

請注意,在許多情況下,在應用程序中設置時區是確保時區正確的唯一方法。因爲您可能無法接觸 MySQL 服務器,但您總是可以更改應用程序代碼。

如果您的應用程序使用某些不支持設置時區的 ORM,您仍然有其他選項:

  1. 在任何其他查詢之前執行時區設置查詢 (SET time_zone = '+00:00';)
  2. 使用不同的數據類型存儲日期時間,例如 INTVARCHAR,並在應用程序中處理時區轉換。
  3. 在將任何日期時間值寫入數據庫之前,將其轉換爲與 MySQL 服務器相同的時區。在讀取日期時間值時,您還必須在應用程序中執行時區轉換。

結論

在本文中,我們學習了日期時間、時間戳和時區的背景知識:日期時間應該包含時區信息,時間戳是獨立於時區的。然後我們學習了MySQL中的日期時間數據類型:DATETIMETIMESTAMP。最後,我們學習瞭如何在MySQL和應用程序中設置時區。