MariaDB DateTime/时区问题:无法转换为正确时区
解决MariaDB时区转换与Gravity Forms同步问题
核心结论
你拿到的'2023-08-21T01:12:15+10:00'是标准带时区偏移的ISO时间字符串,完全可以转换为Australia/Melbourne本地时区,无需用字符串类型存储,以下是具体解决方案:
1. 先确认MariaDB时区表可用性
MariaDB使用Australia/Melbourne这类时区名称,依赖内置时区表支持。先执行以下语句检查:
SELECT * FROM mysql.time_zone_name WHERE Name LIKE '%Melbourne%';
如果无返回结果,需导入时区表:
- Linux系统:执行
mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p mysql - Windows系统:从MariaDB官方下载时区SQL文件导入
2. 恢复字段为datetime类型(推荐)
不要用字符串存储时间,改回datetime后,同步时直接转换格式:
在Zapier的SQL插入步骤中,对时间字段使用转换函数,将带时区的字符串转成墨尔本本地时间:
INSERT INTO your_table (entry_date, date_updated, ...) VALUES ( CONVERT_TZ(STR_TO_DATE('2023-08-21T01:12:15+10:00', '%Y-%m-%dT%H:%i:%s%z'), '+10:00', 'Australia/Melbourne'), CONVERT_TZ(STR_TO_DATE('2023-08-21T01:12:15+10:00', '%Y-%m-%dT%H:%i:%s%z'), '+10:00', 'Australia/Melbourne'), ... );
STR_TO_DATE:将ISO格式字符串解析为带时区偏移的时间CONVERT_TZ:将东10区(+10:00)时间转换为Australia/Melbourne时区时间(自动处理夏令时)
3. Timestamp类型的正确用法
若想用timestamp类型,无需清空全局sql_mode,仅调整会话级参数即可:
SET SESSION sql_mode = 'NO_ENGINE_SUBSTITUTION,ALLOW_INVALID_DATES';
之后直接插入带时区的字符串,MariaDB会自动转成UTC存储,查询时根据会话时区(Australia/Melbourne)返回本地时间:
INSERT INTO your_table (entry_date, date_updated, ...) VALUES ('2023-08-21T01:12:15+10:00', '2023-08-21T01:12:15+10:00', ...);
之前同步失败是因为默认sql_mode包含STRICT_TRANS_TABLES等限制,调整后即可正常同步。
4. 验证并设置时区
确保全局和会话时区均为Australia/Melbourne:
SELECT @@GLOBAL.time_zone, @@SESSION.time_zone;
若不符,执行以下语句设置(需root权限):
SET GLOBAL time_zone = 'Australia/Melbourne'; SET SESSION time_zone = 'Australia/Melbourne';
注意:全局设置需重启MariaDB才会永久生效。
内容的提问来源于stack exchange,提问作者threw000
相关产品推荐
相关产品推荐

