我创建了一个函数来显示已经过了多长时间,但由于某种原因,条件语句不会在第一个elif之后的特定语句处返回。添加打印语句表示该功能在打印出对象时正在流动。我不确定为什么会发生这种情况,因为自从发布一些帖子以来经过的时间超过了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
答案 0 :(得分:4)
首先,您应该修复存在空白的情况,例如60
<{1}}条款的任何。在前两个条件检查中应该是if/elif
< 60
。
此外,所有>= 60
个关键字肯定为or
。想想一天(86,400秒)会发生什么:
and
由于elif total_time > 60 or total_time <= 3600:
return str(int(total_time / 60)) + "m ago."
大于86,400
,因此会触发,导致60
被返回。事实上(一旦你修复了第一段中提到的差距问题),每个值都小于或大于或等于60,你只能看到秒或分钟输出。 / p>
事实上,由于整个1440 m ago.
构造是多余的(if something return else
意味着return
是多余的),您可以更简单地逃脱:
else
答案 1 :(得分:1)
第二个分支中有个错误。
当你这样做的时候
elif total_time > 60 or total_time <= 3600:
它将永远过去。由于它没有达到第一个分支total_time is < 60
,因此您的时间> = 60。由于你的第二个分支中有or
,所以它总是(值60除外)通过。
然后其余的人甚至都没有执行。
您应该更改or's to and's
提示:您甚至不应该检查total_time&gt; 60。想一想,如果代码已经到达那里意味着什么?第一个条件失败,因此保证它将是&gt; = 60。
答案 2 :(得分:1)
你应该在你的if语句中使用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
而不是and
- 当它进入第一个或者,它知道“是的我超过60秒”,然后不关心另一个声明因为它已经成功了。因此,为什么它总是在几分钟内显示出来。