为什么秒不转换为小时和天

时间:2016-08-20 04:22:29

标签: python django datetime

我创建了一个函数来显示已经过了多长时间,但由于某种原因,条件语句不会在第一个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

3 个答案:

答案 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秒”,然后不关心另一个声明因为它已经成功了。因此,为什么它总是在几分钟内显示出来。