到目前为止,我认为它TIMESTAMP应该MySQL包含有关timezone
但在实践中面对该主题时,我收到以下信息
mysql> SELECT TIMESTAMPDIFF(HOUR , '2020-12-22T04:10:45+00:00', '2020-12-22T04:10:45+03:00');
+--------------------------------------------------------------------------------+
| TIMESTAMPDIFF(HOUR , '2020-12-22T04:10:45+00:00', '2020-12-22T04:10:45+03:00') |
+--------------------------------------------------------------------------------+
| -3 |
+--------------------------------------------------------------------------------+
1 row in set (0.00 sec)
除了。在尝试从 python 写入数据时,我还遇到一种情况,表明我不明白它应该如何工作(很可能)或者我配置了错误:
from common.mysql_connection import db_connection
from datetime import datetime
import pytz
call_datetime: datetime = pytz.utc.localize(datetime.fromisoformat('2020-12-22 04:10:45'))
in_server = call_datetime.astimezone(pytz.timezone('Europe/Moscow'))
print(call_datetime, in_server)
db_connection.cursor.executemany(
"insert into infinity.calls (row_id, trigger_datetime) values (%s, %s);", [
[
126356,
in_server
],
[
5858585,
call_datetime
]
]
)
# 2020-12-22 04:10:45+00:00 2020-12-22 07:10:45+03:00
其实是一个问题。是否有可能(并且应该)以这样的方式完成
2020-12-22 04:10:45+00:00 == 2020-12-22 07:10:45+03:00
将代码中的所有时间值转换为服务器的时区是没有问题的。我只是不明白它应该如何在 MySQL 中正常工作
UPD
insert into test (
ts, # timestamp
dt # datetime
)
values ('2020-12-22 04:10:45+03:00', '2020-12-22 04:10:45+00:00'),
('2020-12-22 04:10:45+03:00', '2020-12-22 04:10:45+00:00');


时间戳与时区无关(至少在 UNIX 上)。这是自 1970 年 1 月 1 日午夜 UTC(格林威治标准时间,没有夏令时)以来的“绝对时间点”的秒数。换句话说,无论您所在的时区如何,时间戳都代表着在任何地方都相同的时刻。
使用 DATETIME 类型
来自 mysql 文档