在尝试比较 Python 和 MySQL 之间的值时,我遇到了一个非常奇怪的错误。
我在数据库中有一个“created”列(类型为“datetime”),例如,我有这两个值:
"2018-03-15 10:11:47"
"2018-10-28 02:06:08"
当使用 UNIX_TIMESTAMP(created) 转换为时间戳时,我得到以下信息:
1521105107
1540688768
现在,如果我在 Python 中重新创建这些日期并获取时间戳 (Python3),我将得到以下信息:
第一次约会:
dt = datetime.datetime(year=2018, month=3, day=15, hour=10, minute=11, second=47)
print(int(dt.timestamp()))
$> 1521105107 # Same as the database
第二次约会:
dt = datetime.datetime(year=2018, month=10, day=28, hour=2, minute=6, second=8)
print(int(dt.timestamp()))
$> 1540685168 # Different!
为什么?发生了什么事?
如果由于时间戳,我在数据库或 Python 上有任何增量,它会针对每一行,而不是几行。
我怀疑数据库正在跟踪 created
列的某个时区,但没有显示,但我被困在那里......
最佳答案
您需要确保在处理 DATETIME 列时,您的 MySql 服务器使用的时区与您的 Python 环境使用的时区相同,特别是当您使用从NOW() 等函数调用,或者,例如,当您通过调用 UNIX_TIMESTAMP 转换该列时。
所以,当我连接时,我做的第一件事就是发出一个命令,例如 'set time_zone = 'America/New_York';
(但只是因为我喜欢纽约;您 可能会喜欢其他地方)然后我就不必担心我的服务器是在犹他州还是在纽约,也不需要知道夏令时何时生效。如果您发现您的服务器上没有诸如“America/New_York”之类的时区,那么您应该查看Time zone description tables。 .其次,你应该安装 Python 包 pytz .然后您将可以访问许多其他时区。 并在构建datetime.datetime
对象时使用明确的时区! 据我所知,我的 ISP 的 Python 环境可能没有与其 MySql 服务器完全相同的时区设置,而且两者都没有是我无论如何都想使用的。希望如果您遵循这些准则,这些差异应该会消失。如果没有,我会退还您的钱。
关于python - datetime => timestamp 的差异仅在某些情况下?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57629467/