44

こんにちは、なぜこれが起こっているのかを理解するために助けが必要です。イベントプログラムで「残り時間」を追跡する方法があります。

def get_program_time_budget(self):
    return self.estimated_duration-self.get_program_duration() 

すべて問題ありestimated_duration > self.get_program_duration()ませんが、これが逆になると、おかしくなります。

結果がユーザーに表示されます。

Estimated   11 hours    Allocated       10 hours 55 minutes     Remaining       5 minutes

結果が負になると、次のようになります。

Estimated   11 hours    Allocated       11 hours 5 minutes  Remaining       -1 day 23 hours 55 minutes

結果を取得する方法はありますか? -5分?

フォーマッタは次のとおりtimedeltaです (これは Django フィルタであるため、timedelta値をstr- として受け取りますが、として保存されますtimedelta)。

def format_duration(value):
  try:
    delim = ':'
    toks = value.split(',')
    hour = minute = ''
    d_string = value.count('day') and toks[0] or ''
    h, m, s = d_string and toks[-1].strip().split(delim) or value.split(delim)
    try:
        hour = int(h)
    except:
        pass
    try:
        minute = int(m)
    except:
        pass  
    h_string = "%s%s%s" % (hour and hour or '', (hour and ' hour' or ''),(hour and hour > 1 and 's' or '')  )
    m_string = "%s%s%s" % (minute and minute or '', (minute and ' minute' or ''),(minute and minute > 1 and 's' or ''))
    return "%s %s %s" % (d_string, h_string, m_string)
  except Exception, e:
    logging.error("Error in format_duration -> %s. Duration value=%s" % (e, value))
    return ''v 
4

3 に答える 3

66

Python 2.7 以降を使用している場合は、timedelta の表現を正または負の秒数としてtimedelta.total_seconds()取得するために使用できます。float

>>> datetime.timedelta(-1, 86100).total_seconds()
-300.0

これを使用して、かなり簡単に分数を計算できるはずです。

Python 2.7 を使用していない場合は、ドキュメントから次の同等の式を使用できます。

(td.microseconds + (td.seconds + td.days * 24 * 3600) * 10**6) / 10.0**6

編集:おそらく timedelta のデフォルトの文字列表現を使用して結果を表示しているように見えるので、私の元の答えはそれほど役に立たないかもしれません. 結果を表示するには、次のようなものをお勧めします。

def get_program_time_budget(self):
    td = self.estimated_duration-self.get_program_duration()
    if td.days < 0:
        return '-' + str(datetime.timedelta() - td)
    return str(td)

これにより、timedelta の代わりに文字列が返され、負の timedelta の場合は、正の timedelta の前に「-」が追加されます。

于 2011-12-06T23:45:52.170 に答える
26

なんで?

方法の意図しない副作用として定義されている可能性が//あります。%

datetimeおそらく、クラスの実装が容易になるためです。エポックの 5 分前は 0:-5 ではなく 23:55 です。

それは本当に問題ではありません。daysseconds、およびmicrosecondsが正規化される方法であることを知っておいてください。そして、それは簡単に回避できます。

def format_timedelta(td):
    if td < timedelta(0):
        return '-' + format_timedelta(-td)
    else:
        # Change this to format positive timedeltas the way you want
        return str(td)

 >>> format_timedelta(timedelta(minutes=-5))
 '-0:05:00'
于 2011-12-07T00:36:31.823 に答える