こんにちは私はこれがなぜ起こっているのか理解するのに助けが必要です。イベントプログラムで「残り時間」を追跡する方法があります。
def get_program_time_budget(self):
return self.estimated_duration-self.get_program_duration()
Stimulated_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
Python 2.7以降を使用している場合、 timedelta.total_seconds()
を使用して、timedeltaの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の前に「-」が付加されます。
どうして?
おそらく、方法の意図しない副作用として//
および%
が定義されています。
datetime
クラスの実装が容易になるためと考えられます。エポックの5分前は23:55で、0:-5ではありません。
それは本当に重要ではありません。 days
、seconds
、および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'