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和应用程序中设置时区。