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



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

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

请在下面找到我的代码:

import time, datetime, sys, os 
start_time = time.time() 
from datetime import datetime, timedelta, date 
from dateutil.parser import *
datetime1="2018-07-13 03:30:00"  
datetime2="2018-07-20 04:30:00" 
datetime2=datetime.strptime(datetime2, "%Y-%m-%d %H:%M:%S").date() # this is to convert it into a datetime object
datetime1=datetime.strptime(datetime1, "%Y-%m-%d %H:%M:%S").date() # this is to convert it into a datetime object
difference1 =(datetime2-datetime1).total_seconds() 
print("the difference in seconds is "+str(difference1)) 
if difference1 > 604800: #if the difference is more than 7 days, relax , else start preparing
print("Relax you have time!!!") 
else:
print("You need to start preparing!!!!!")

问题:

只有当我将"datetime2">更改为"2018-07-21"时,代码才会以秒为单位计算出时间大于604800,这意味着它是以四舍五入的天数而不是秒为单位来计算差异,然后简单地将四舍五进的天数转换为秒,给出了错误的答案。

例如,在上面的代码中,由于"datetime2">实际上与"datetime1">相差604800多秒(准确地说是608400秒(,因此输出应该是"放松,你有时间!!",但我们得到了不同的输出。

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

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

如何检查两次约会之间的差异(以秒为单位(?(对我来说不起作用,因为我得到了TypeError:需要一个整数(得到的类型是datetime.date((

以及以秒为单位的时间差(作为浮点((这只适用于非常小的时间差,并且不会捕捉用户自己输入时间戳时的场景(

以及如何计算两个时间字符串之间的时间间隔(这是我在代码中所做的,但它没有按预期工作(

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

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

在这种情况下,问题是使用strptime创建两个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对象可以直接进行比较,因此您不需要计算秒数,因此您可以更改该部分以避免"秒数"计算(您的意图更明确(:

difference1 = datetime2 - datetime1
# if the difference is more than 7 days, relax , else start preparing
if difference1 > timedelta(days=7):

我想,在现实中,你并没有像本例中那样从字符串文本构建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!!!!!")

最新更新