Python:日期-时间差给出错误的结果

Python:日期-时间差给出错误的结果,python,datetime,python-dateutil,Python,Datetime,Python Dateutil,我编写了一个简单的代码来检查两个日期时间戳之间的时间差是否超过7天,即604800秒 如果以秒为单位的时间超过604800,则应打印“放松,你有时间!!!” 请在下面找到我的代码: 问题: 只有当我将“datetime2”更改为“2018-07-21”时,代码才会以秒为单位计算时间超过604800秒,这意味着它是在计算舍入天数而不是秒的差值,然后简单地将舍入天数转换为秒,给出了错误的答案 例如,在上面的代码中,由于“datetime2”实际距离“datetime1”超过604800秒(准确地说是

我编写了一个简单的代码来检查两个日期时间戳之间的时间差是否超过7天,即604800秒

如果以秒为单位的时间超过604800,则应打印“放松,你有时间!!!”

请在下面找到我的代码:

问题:

只有当我将“datetime2”更改为“2018-07-21”时,代码才会以秒为单位计算时间超过604800秒,这意味着它是在计算舍入天数而不是秒的差值,然后简单地将舍入天数转换为秒,给出了错误的答案

例如,在上面的代码中,由于“datetime2”实际距离“datetime1”超过604800秒(准确地说是608400秒),因此输出应该是“放松你有时间!!!”,但我们得到的是不同的输出

我做了什么来解决这个问题?

到目前为止,我已经研究过类似的问题:

(由于我得到了TypeError,所以不适用于我:需要一个整数(得到了datetime.date类型))

及 (这只满足非常微小的时间差异,并且不会捕获用户自己输入时间戳时的场景)

及 (这是我在代码中所做的,但它没有按预期工作)

你能在我的代码中提出这个问题吗

更新:感谢@Tim Peters指出.date()丢弃小时、分钟和秒。
我只需要丢弃.date(),它就可以正常工作。

在这种情况下,问题是您使用
strtime
创建了两个
datetime.datetime
对象,并立即将它们截断为
datetime.date
对象,它们没有时间组件(小时、分钟、秒、微秒、tzinfo),所以你有两个相隔7天的日历日期

您可以按如下方式修复原始代码:

from datetime import datetime, timedelta

datetime1 = "2018-07-13 03:30:00"
datetime2 = "2018-07-20 04:30:00"

# The following creates two datetime.datetime objects
datetime2 = datetime.strptime(datetime2, "%Y-%m-%d %H:%M:%S")
datetime1 = datetime.strptime(datetime1, "%Y-%m-%d %H:%M:%S")

difference1 =(datetime2-datetime1).total_seconds() 
print("the difference in seconds is "+str(difference1)) 

# if the difference is more than 7 days, relax , else start preparing
if difference1 > 604800:
  print("Relax you have time!!!") 
else:
  print("You need to start preparing!!!!!")
但需要注意的另一点是,可以直接比较
datetime.timedelta
对象,因此不需要计算秒数,因此可以更改该部分以避免“秒数”计算(您的意图更清楚):

我想象在现实中,您并没有像在本例中那样从字符串文本构建
datetime.datetime
对象,但如果您是这样,我还要注意,您也可以直接构建这些文本,因此,在进行重构后,我将如何编写您的示例:

from datetime import datetime, timedelta

# The following creates two datetime.datetime objects
datetime1 = datetime(2018, 7, 13, 3, 30)
datetime2 = datetime(2018, 7, 20, 4, 30)

difference1 = datetime2 - datetime1

# if the difference is more than 7 days, relax , else start preparing
if difference1 > timedelta(days=7):
  print("Relax you have time!!!") 
else:
  print("You need to start preparing!!!!!")

注意:
.date()
从datetimes截断时间组件,并创建一个datetime.date对象。在@Paul的注释上展开。通过使用
.date()
你可以浪费时间、分钟和秒。结果是
datetime.date
对象正好相隔7天。@TimPeters:谢谢,我不知道它丢弃了小时、分钟和秒。是否有类似于.date()的东西不丢弃小时、分钟和秒?是的!只需删除
.date()
的实例即可。在特意损坏对象之前,您拥有完整的
datetime.datetime
对象;-)@蒂姆彼得斯:哇,那很容易!我完全错过了!谢谢
difference1 = datetime2 - datetime1

# if the difference is more than 7 days, relax , else start preparing
if difference1 > timedelta(days=7):
from datetime import datetime, timedelta

# The following creates two datetime.datetime objects
datetime1 = datetime(2018, 7, 13, 3, 30)
datetime2 = datetime(2018, 7, 20, 4, 30)

difference1 = datetime2 - datetime1

# if the difference is more than 7 days, relax , else start preparing
if difference1 > timedelta(days=7):
  print("Relax you have time!!!") 
else:
  print("You need to start preparing!!!!!")