理解 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 中,有几种日期时间数据类型,但最重要的是 DATETIME
和 TIMESTAMP
。
DATETIME
:日期和时间,格式为YYYY-MM-DD HH:MM:SS
。它存储日期和时间,因此必须考虑时区。TIMESTAMP
:时间戳,它存储时间戳数字,是与时区无关的。但当您写入或读取时间戳时,会进行时区转换。
MySQL 中的时区
MySQL 有一个系统变量 time_zone
用于设置时区。您可以通过以下方式设置时区:
在配置文件
my.cnf
中设置时区:ini[mysqld] default-time-zone = '+00:00'
在 MySQL 客户端中设置时区:
sqlSET time_zone = '+00:00';
在连接字符串中设置时区:
sqlmysql -u root -p --default-time-zone='+00:00'
如果您没有设置时区,MySQL 将默认使用系统时区。
在应用程序中设置时区
当您在应用程序中使用 MySQL 时,应该在应用程序中设置时区。例如,在 Node.js 中,您可以这样设置时区:
const mysql = require('mysql2');
const conn = mysql.createConnection({
host: 'localhost',
user: 'root',
password: 'password',
database: 'test',
timezone: '+00:00'
});
请注意,在许多情况下,在应用程序中设置时区是确保时区正确的唯一方法。因为您可能无法接触 MySQL 服务器,但您总是可以更改应用程序代码。
如果您的应用程序使用某些不支持设置时区的 ORM,您仍然有其他选项:
- 在任何其他查询之前执行时区设置查询 (
SET time_zone = '+00:00';
) - 使用不同的数据类型存储日期时间,例如
INT
或VARCHAR
,并在应用程序中处理时区转换。 - 在将任何日期时间值写入数据库之前,将其转换为与 MySQL 服务器相同的时区。在读取日期时间值时,您还必须在应用程序中执行时区转换。
结论
在本文中,我们学习了日期时间、时间戳和时区的背景知识:日期时间应该包含时区信息,时间戳是独立于时区的。然后我们学习了MySQL中的日期时间数据类型:DATETIME
和 TIMESTAMP
。最后,我们学习了如何在MySQL和应用程序中设置时区。