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



我创建了一个函数来显示经过了多少时间,但由于某些原因,条件语句在第一个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。因此,为什么它总是以分钟为单位显示。

相关内容

  • 没有找到相关文章

最新更新