2016-08-20 15 views
0

時間が経過するまでの時間を表示する関数を作成しましたが、何らかの理由で最初の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 
+0

デバッガを使用してコードをステップ実行しましたか?また、代わりに 'timedelta'を使用してみませんか? – ray

+0

あなたは['django.contrib.humanize.naturaltime'](https://docs.djangoproject.com/ja/1.10/ref/contrib/humanize/#naturaltime)を使いたいかもしれません – solarissmoke

答えて

4

まずアップ、あなたはif/elif条項のいずれかのでキャッチされることはありませんあなたはギャップを持っている場合、など60を修正する必要があります。最初の2つの条件チェックで>= 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未満またはより大きいか60以上になると、秒または分の出力しか表示されません。全体if something return else構築物は(returnelseは不要であることを意味する)冗長であることから、あなたは単純に逃げることができ、実際には

、:

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に設定し、あなたの頭にそのコードを実行します。 '<60'ではないので、最初の' if'条件と一致しません。それは '> 60'ではないので、第2の' if'条件の最初の節と一致しません。一方の端ではなく、他方の端ではなく、半開きの範囲を使用する必要があります。 – paxdiablo

+0

さて、それは今より意味をなさない – BigMonkey89WithaLeg

1

2番目のブランチにバグがあります。

elif total_time > 60 or total_time <= 3600:とすると、それは常に合格となります。それが最初の枝total_time is < 60に当たっていないのであなたの時間は> 60です。 2番目のブランチにorがあるので、(60の値を除いて)常にパスします。

その後、残りの部分は実行されません。 変更する必要がありますor's to and's

ヒント:total_time> 60を確認しないでください。それを考えてください。すでにコードがあれば、どういう意味でしょうか?最初の条件は、したがって、あなたはそれが可能になることが保証され、失敗した> = 60

1

あなたのif文の中にand代わりのorを使用する必要があります - それが最初に来るとき、または「はい、私は60秒以上です」を知っています、そして、それはすでに真実に当たっているので、他の声明は気にしません。したがって、なぜそれが常に数分で表示されるのか?

関連する問題