我创建了一个函数来显示经过了多少时间,但由于某些原因,条件语句在第一个elif之后的特定语句中不会返回。添加print语句表明函数在打印对象时是流动的。我不知道为什么会发生这种情况,因为一些帖子发布后的时间超过了3600秒。因此,它只是将所有经过的时间转换为分钟,但我要说的是,以秒为单位的时间运行正常。我的转换是错误的,还是语法或类型错误?还有,有更好的方法吗?
def time_diff(self):
if self.date_pub:
now = datetime.datetime.utcnow().replace(tzinfo=utc)
diff = now - self.date_pub
total_time = diff.total_seconds()
if total_time < 60:
return str(int(total_time)) + "s ago."
elif total_time > 60 or total_time <= 3600:
return str(int(total_time / 60)) + "m ago."
elif total_time >= 3600 or total_time <= 86400:
return str(int(total_time / 3600)) + "h ago."
elif total_time >= 86400 or total_time <= 604800:
return str(nt(total_time / 86400)) + "d ago."
else:
return date_pub
首先,您应该修复有间隙的情况,例如60
,它不会被if/elif
子句的任何捕获。在前两个条件检查中应该是< 60
和>= 60
。
此外,所有这些or
关键字都应该肯定是and
。想想一天(86400秒(会发生什么:
elif total_time > 60 or total_time <= 3600:
return str(int(total_time / 60)) + "m ago."
由于86,400
大于60
,因此会触发,导致返回1440 m ago.
。事实上(一旦你解决了第一段中提到的差距问题(,每个值都小于或大于或等于60,你只会看到秒或分钟的输出。
事实上,由于整个if something return else
结构是多余的(return
意味着else
是多余的(,您可以使用更简单的方法:
if total_time < 60:
return str(int(total_time)) + "s ago."
if total_time < 3600:
return str(int(total_time / 60)) + "m ago."
if total_time < 86400:
return str(int(total_time / 3600)) + "h ago."
if total_time < 604800:
return str(int(total_time / 86400)) + "d ago."
return self.date_pub
您在第二个分支中有一个错误。
当你这样做的时候elif total_time > 60 or total_time <= 3600:
它总是会过去。由于它没有击中第一个分支total_time is < 60
,所以你的时间>=60。由于您在第二个分支中有一个or
,它将始终通过(值为60除外(
然后他们中的其他人甚至都不执行。您应该更改or's to and's
提示:您甚至不应该检查total_time是否大于60。想想看,如果代码已经存在,那意味着什么?第一个条件失败,因此您可以保证它将>=60。
您应该在if语句中使用and
而不是or
——当它进入第一个语句时,或者,它知道"是的,我超过60秒了",然后不关心另一个语句,因为它已经达到true。因此,为什么它总是以分钟为单位显示。