2016-08-20 32 views
0

我創建了一個函數來顯示已經過了多少時間,但由於某種原因,條件語句不會在第一個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

您是否使用調試器來遍歷代碼?另外,爲什麼不使用'timedelta'呢? – ray

+0

您可能想使用['django.contrib.humanize.naturaltime'](https://docs.djangoproject.com/zh/1.10/ref/contrib/humanize/#naturaltime) – solarissmoke

回答

4

首先,你應該可以解決,你有差距的情況下,如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,40060更大,這將觸發,導致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 
+0

首先,感謝您的幫助你的答案,但我不明白你的答案第一行中的差距,如60。 – BigMonkey89WithaLeg

+2

@ BigMonkey89WithaLeg:將'total_time'設置爲60,然後在您的腦海中運行該代碼。它不會匹配第一個「if」條件,因爲它不是「<60」。由於它不是'> 60',它也不會匹配第二個'if'條件中的第一個子句。你需要使用所謂的半開放範圍,包括一端而不是另一端。 – paxdiablo

+0

好的,現在更有意義 – BigMonkey89WithaLeg

1

您在第二個分支中有一個錯誤。

當你做 elif total_time > 60 or total_time <= 3600:它會一直通過。由於它沒有擊中第一個分支total_time is < 60,所以你的時間> = 60。由於你在第二個分支中有一個or,它總是(除了60的值)通過。

然後其他人甚至不執行。 您應該更改or's to and's

提示:您甚至不應檢查total_time> 60。想想看,如果代碼已經到達那裏是什麼意思?第一個條件失敗了,所以你保證,這將是> = 60

1

您應該將if語句中使用and代替or - 當它進入第一個或它知道「是的,我超過60秒」,然後不關心其他陳述,因爲它已經成爲真實的。因此,爲什麼它總是在幾分鐘內顯示。