Python 日期时间差异=>;仅在某些情况下使用时间戳?

Python 日期时间差异=>;仅在某些情况下使用时间戳?,python,mysql,datetime,Python,Mysql,Datetime,在尝试比较Python和MySQL之间的值时,我遇到了一个非常奇怪的错误 我在数据库中有一个“created”列(类型为“datetime”),我有两个值: "2018-03-15 10:11:47" "2018-10-28 02:06:08" 使用UNIX_Timestamp(已创建)转换为时间戳时,我得到以下结果: 1521105107 1540688768 现在,如果我用Python重新创建这些日期,并获得时间戳(Python3),我会得到以下结果: 1521105107 154068

在尝试比较Python和MySQL之间的值时,我遇到了一个非常奇怪的错误

我在数据库中有一个“created”列(类型为“datetime”),我有两个值:

"2018-03-15 10:11:47"
"2018-10-28 02:06:08"
使用UNIX_Timestamp(已创建)转换为时间戳时,我得到以下结果:

1521105107
1540688768
现在,如果我用Python重新创建这些日期,并获得时间戳(Python3),我会得到以下结果:

1521105107
1540688768
第一天:

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上有任何增量,那么它将用于每一行,而不是几行


我怀疑数据库正在跟踪
创建的
列的某个时区,但没有显示,但我被卡在那里了…

在处理DATETIME列时,需要确保MySql服务器使用的时区与Python环境使用的时区相同,特别是当您使用从函数调用(如NOW()生成的值)初始化该列时,或者例如,当您使用对UNIX_时间戳的调用转换该列时


因此,当我连接时,我要做的第一件事就是发出一个命令,比如
'set timeu_zone='America/New_York'(但这只是因为我喜欢纽约;你可能喜欢其他地方),这样我就不必担心我的服务器是否在犹他州或纽约,也不必知道夏令时何时生效。如果您发现您的服务器上没有诸如“America/New_York”之类的时区,那么您应该查看。其次,您应该安装Python包。然后,您将可以访问许多其他时区并在构造
datetime.datetime
对象时使用显式时区
据我所知,我的ISP的Python环境可能没有与MySql服务器相同的精确时区设置,我也不想使用这一设置。希望,如果您遵循这些指导原则,这些差异会消失。如果没有,我会把钱还给你。

我怀疑是时区差异造成了你的问题。您的数据库和本地机器(或运行python的机器)可能使用不同的默认时区,并在尝试转换时进行相应调整。查看哪个使用哪个时区可能是一个好主意。UNIX_TIMESTAMP函数基本上将获取在当前时区中解释的日期时间值,并将其转换为UTC(实际上是自“1970-01-01 00:00”UTC以来经过的秒数)。有趣的是,其中一个转换的日期时间与您的Python值比较相等(这是在同一个框中计算的吗?),而另一个关闭一小时。这确实表明,对于这两种环境,时区是不同的,但区别可能只是一个使用夏令时,另一个不使用夏令时。我之前的评论暗示但没有明确说明DATETIME列中没有存储任何时区信息。MySql服务器的会话有一个有效的默认当前时区的概念,这个值可以通过
set session time_zone='timezone specification'更改,用于在调用UNIX\u时间戳时提供“缺少”时区信息。尝试:
选择是否(@@session.time\u zone='SYSTEM',@@SYSTEM\u time\u zone,@@session.time\u zone)
DATETIME代表本地时间,而时间戳是时区感知的。你好@Ronaldaronson,谢谢你的帖子。DST可能是这里的解决方案!当设置两个不同的时间戳时,它清楚地显示相同的小时,但第一个显示“2:06:08 AM GMT+01:00”,第二个显示。。。“格林尼治标准时间凌晨2:06:08+夏令时02:00”。问题是,我不知道EpochConverter如何知道何时使用DST。(当然,我使用了相同的浏览器,甚至在测试时使用了相同的页面,其间没有任何变化)。您有什么想法吗?在MySQL级别(使用
SET time_zone=“+00:00”
)和Python级别(使用
dt.replace(tzinfo=datetime.timezone.UTC)将时区设置为UTC。astimezone(tz=None)。timestamp()
)使其工作正常。