timedeltaを文字列にフォーマット


275

datetime.timedeltaオブジェクトのフォーマットに問題があります。

これが私がやろうとしていることです。オブジェクトのリストがあり、オブジェクトのクラスのメンバーの1つは、イベントの継続時間を示すtimedeltaオブジェクトです。その期間を時間:分という形式で表示したいと思います。

これを行うためにさまざまな方法を試しましたが、困難を感じています。私の現在のアプローチは、時間と分を返すオブジェクトのクラスにメソッドを追加することです。timedelta.secondsを3600で割り、四捨五入することで時間を取得できます。残りの秒を取得し、それを分に変換することに問題があります。

ちなみに、私はプレゼンテーションのためにDjangoテンプレートでGoogle AppEngineを使用しています。


44
timedeltaにstrftime()メソッドと同等の機能がある場合は、すばらしいでしょう。
JS。

@JS。まあ、を使えば多少はできますdatetime.utcfromtimestamp()。以下の私の答えを参照しください。
sjngm 2015年

@JS。-100%同意する その後、__str__のではtimedeltaと対照的に、かなりまともである__repr__(である! -人間のため)。たとえば:datetime.timedelta(minutes=6, seconds=41) * 2618 / 48できますdatetime.timedelta(seconds=21871, microseconds=208333)が、str(datetime.timedelta(minutes=6, seconds=41) * 2618 / 48)与え'6:04:31.208333'読みかなりOKです。
Tomasz Gandor

回答:


213

str()を使用して、timedeltaを文字列に変換できます。次に例を示します。

import datetime
start = datetime.datetime(2009,2,10,14,00)
end   = datetime.datetime(2009,2,10,16,00)
delta = end-start
print(str(delta))
# prints 2:00:00

13
timedeltaを引数としてstr()メソッドを呼び出すようなものです。
joeforker 2009

12
そこではstr呼び出しは必要ありません。印刷によって自動的に行われます。
Zitrax 2014

5
@Zitraxただし、デルタを別の文字列と連結する場合は必要です。例えばprint 'some thing ' + str(delta)
Plinio.Santos

13
データ型が 'datetime.timedelta'として定義されており、このように使用している場合はConvertDuration=datetime.timedelta(milliseconds=int(254459))、splitを使用してマイクロ秒を無効にします。03:0 43.765000私は得ることができます夜12時03分43秒を簡単に実行することによってTotalDuration=str(ConvertDuration).split('.', 2)[0]
DarkXDroid

16
これは、デルタを文字列として出力する可能性がありますが、OPが要求したとおりにフォーマットされません。
Dannid、2015

187

ご存知のとおり、timedeltaオブジェクトからtotal_secondsを取得するには、 .seconds属性にます。

Pythonは、以下divmod()を可能にする組み込み関数を提供します。

s = 13420
hours, remainder = divmod(s, 3600)
minutes, seconds = divmod(remainder, 60)
print '{:02}:{:02}:{:02}'.format(int(hours), int(minutes), int(seconds))
# result: 03:43:40

または、モジュロと減算の組み合わせを使用して、時間と残りに変換できます。

# arbitrary number of seconds
s = 13420
# hours
hours = s // 3600 
# remaining seconds
s = s - (hours * 3600)
# minutes
minutes = s // 60
# remaining seconds
seconds = s - (minutes * 60)
# total time
print '{:02}:{:02}:{:02}'.format(int(hours), int(minutes), int(seconds))
# result: 03:43:40

5
負のtimedeltaの場合、最初に符号を評価し、次にを実行する必要がありますabs(s)
mbarkhau

27
実際に使用'%d:%02d:%02d'して、出力文字列に先行ゼロを含めることができます。
ShinNoNoir 2014年

12
Python 2.7以降では、.total_seconds()メソッドを使用します
sk8asd123 '22

27
.seconds差がマイナスになる可能性がある場合、または24時間を超える可能性がある場合は使用しないでください(.seconds属性は無視します.days)。.total_seconds()代わりにまたはそのアナログを使用してください。
jfs 2015年

ポジティブな違いのために、私はこれを時々再実装しています。今回はただ検索していただきありがとうございます:)
ウルフ

59
>>> str(datetime.timedelta(hours=10.56))
10:33:36

>>> td = datetime.timedelta(hours=10.505) # any timedelta object
>>> ':'.join(str(td).split(':')[:2])
10:30

timedeltaオブジェクトをstr()関数に渡すと、単純にと入力した場合と同じフォーマットコードが呼び出されますprint td。秒は必要ないので、文字列をコロン(3パート)で分割し、最初の2パートのみで元に戻すことができます。


あなたの答えjoeforkerをありがとう、しかし私はあなたの応答を理解するかどうかわかりません。datetime-datetimeを介してタイムデルタを取得しています。時間はわかりません。さらに、あなたの例には秒が含まれているようですが、どうすれば削除できますか?
mawcs

1
timedeltaオブジェクトをどこで取得するかは関係ありません。同じ形式になります。
joeforker 2009

9
1日より長い場合は、分割/結合処理後、「4日、8:00」のような形式になります。
joeforker 2009

4
str(my_timedelta)負の数ではうまく機能しない
Catskul 2014年

2
24時間を超える場合も日数を表示します(例:「4日、18:48:22.330000」)。ここでアドバイスされている多くの方法はそうではありません。
Alexei Martianov

47
def td_format(td_object):
    seconds = int(td_object.total_seconds())
    periods = [
        ('year',        60*60*24*365),
        ('month',       60*60*24*30),
        ('day',         60*60*24),
        ('hour',        60*60),
        ('minute',      60),
        ('second',      1)
    ]

    strings=[]
    for period_name, period_seconds in periods:
        if seconds > period_seconds:
            period_value , seconds = divmod(seconds, period_seconds)
            has_s = 's' if period_value > 1 else ''
            strings.append("%s %s%s" % (period_value, period_name, has_s))

    return ", ".join(strings)

3
本当にいいのですが、変更if seconds > period_seconds:することをお勧めしif seconds >= period_seconds:ます。
CBenni 2015年

1
これは、負のタイムデルタに対して空の文字列を返します。これが意図されているかどうかわかりませんか?
ダーク:

31

私は個人的humanizeにこのライブラリを使用しています:

>>> import datetime
>>> humanize.naturalday(datetime.datetime.now())
'today'
>>> humanize.naturalday(datetime.datetime.now() - datetime.timedelta(days=1))
'yesterday'
>>> humanize.naturalday(datetime.date(2007, 6, 5))
'Jun 05'
>>> humanize.naturaldate(datetime.date(2007, 6, 5))
'Jun 05 2007'
>>> humanize.naturaltime(datetime.datetime.now() - datetime.timedelta(seconds=1))
'a second ago'
>>> humanize.naturaltime(datetime.datetime.now() - datetime.timedelta(seconds=3600))
'an hour ago'

もちろん、それはあなたが探していた答えを正確に与えるわけではありません(実際、str(timeA - timeB)ですが、数時間を超えると、表示がすぐに判読できなくなることがわかりました。humanizeあるはるかに大きい値をサポートしています人間が読める形式で、ローカライズもされています。

これcontrib.humanizeは明らかにDjangoのモジュールに触発されているため、Djangoを使用しているので、おそらくそれを使用する必要があります。


2
いいですが、+ 1:humanize.naturaldelta(pd.Timedelta( '-10sec'))-> '10 seconds ':S ...
ntg

2
よくそれ 10秒のデルタです。:)それはあなたが時間を望んでいるnaturaltimeあなたが使いたいものです。
anarcat 16

28

彼はすでにtimedeltaオブジェクトを持っているので、組み込みメソッドtotal_seconds()を使用して秒に変換してから、divmod()を使用して時間と分を取得しませんか?

hours, remainder = divmod(myTimeDelta.total_seconds(), 3600)
minutes, seconds = divmod(remainder, 60)

# Formatted only for hours and minutes as requested
print '%s:%s' % (hours, minutes)

これは、タイムデルタの日数や年数に関係なく機能します。


23

timedeltaオブジェクトまたは通常の数値(秒や分などの形式)を適切にフォーマットされた文字列に変換するための汎用関数を次に示します。mpounsettの素晴らしい答え受け取りました重複した質問に対してし、それを少し柔軟にし、読みやすさを向上させ、ドキュメントを追加しました。

次のことができるので、これがこれまでのところ最も柔軟な答えであることがわかります。

  1. 文字列形式をハードコードする代わりに、その場でカスタマイズします。
  2. 問題なく特定の時間間隔を除外します(以下の例を参照)。

関数:

from string import Formatter
from datetime import timedelta

def strfdelta(tdelta, fmt='{D:02}d {H:02}h {M:02}m {S:02}s', inputtype='timedelta'):
    """Convert a datetime.timedelta object or a regular number to a custom-
    formatted string, just like the stftime() method does for datetime.datetime
    objects.

    The fmt argument allows custom formatting to be specified.  Fields can 
    include seconds, minutes, hours, days, and weeks.  Each field is optional.

    Some examples:
        '{D:02}d {H:02}h {M:02}m {S:02}s' --> '05d 08h 04m 02s' (default)
        '{W}w {D}d {H}:{M:02}:{S:02}'     --> '4w 5d 8:04:02'
        '{D:2}d {H:2}:{M:02}:{S:02}'      --> ' 5d  8:04:02'
        '{H}h {S}s'                       --> '72h 800s'

    The inputtype argument allows tdelta to be a regular number instead of the  
    default, which is a datetime.timedelta object.  Valid inputtype strings: 
        's', 'seconds', 
        'm', 'minutes', 
        'h', 'hours', 
        'd', 'days', 
        'w', 'weeks'
    """

    # Convert tdelta to integer seconds.
    if inputtype == 'timedelta':
        remainder = int(tdelta.total_seconds())
    elif inputtype in ['s', 'seconds']:
        remainder = int(tdelta)
    elif inputtype in ['m', 'minutes']:
        remainder = int(tdelta)*60
    elif inputtype in ['h', 'hours']:
        remainder = int(tdelta)*3600
    elif inputtype in ['d', 'days']:
        remainder = int(tdelta)*86400
    elif inputtype in ['w', 'weeks']:
        remainder = int(tdelta)*604800

    f = Formatter()
    desired_fields = [field_tuple[1] for field_tuple in f.parse(fmt)]
    possible_fields = ('W', 'D', 'H', 'M', 'S')
    constants = {'W': 604800, 'D': 86400, 'H': 3600, 'M': 60, 'S': 1}
    values = {}
    for field in possible_fields:
        if field in desired_fields and field in constants:
            values[field], remainder = divmod(remainder, constants[field])
    return f.format(fmt, **values)

デモ:

>>> td = timedelta(days=2, hours=3, minutes=5, seconds=8, microseconds=340)

>>> print strfdelta(td)
02d 03h 05m 08s

>>> print strfdelta(td, '{D}d {H}:{M:02}:{S:02}')
2d 3:05:08

>>> print strfdelta(td, '{D:2}d {H:2}:{M:02}:{S:02}')
 2d  3:05:08

>>> print strfdelta(td, '{H}h {S}s')
51h 308s

>>> print strfdelta(12304, inputtype='s')
00d 03h 25m 04s

>>> print strfdelta(620, '{H}:{M:02}', 'm')
10:20

>>> print strfdelta(49, '{D}d {H}h', 'h')
2d 1h

とてもきれいなコード!私は...このコードは、フォーマッタの最後の端数剰余秒を扱うように拡張することができるか疑問
kfmfe04

17

これは古い回答の質問であることは知っていますが、これを使用datetime.utcfromtimestamp()します。秒数がかかり、datetime他のようにフォーマットできるを返しますdatetime

duration = datetime.utcfromtimestamp(end - begin)
print duration.strftime('%H:%M')

時間の部分の正当な範囲内にある限り、これは機能します。つまり、時間は23以下であるため、1234:35を返しません。


2
print timedelta(seconds=end - begin)代わりに使用する必要があります。
jfs 2015年

@JFSebastian次に、手動で時間に先行ゼロを埋め込む必要があります。
sjngm 2015年

私は質問のパディングについて何も見ません。.zfill(8)必要に応じて使用してください。
jfs

1
.total_seconds()呼び出しが必要です:>>> datetime.utcfromtimestamp((t2-t1).total_seconds())。strftime( "%H:%M:%S")<<< >>> '00:00: 05 '
キャグニー

2
私はこのソリューションを非常に好みます、それはあなたがフォーマットを制御することを可能にします。次のようにstrフォーマッタを直接使用することもできます: "{0:%H}:{0:%M}"。format(duration)
toes

15

質問者は、通常よりも優れたフォーマットを望んでいます。

  >>> import datetime
  >>> datetime.timedelta(seconds=41000)
  datetime.timedelta(0, 41000)
  >>> str(datetime.timedelta(seconds=41000))
  '11:23:20'
  >>> str(datetime.timedelta(seconds=4102.33))
  '1:08:22.330000'
  >>> str(datetime.timedelta(seconds=413302.33))
  '4 days, 18:48:22.330000'

したがって、実際には2つの形式があります。1つは日が0で省略されている形式、もう1つは「n日、h:m:s」というテキストがある形式です。ただし、秒には小数があり、印刷結果に先行ゼロがないため、列が乱雑です。

気に入ったら、これが私のルーティンです。

def printNiceTimeDelta(stime, etime):
    delay = datetime.timedelta(seconds=(etime - stime))
    if (delay.days > 0):
        out = str(delay).replace(" days, ", ":")
    else:
        out = "0:" + str(delay)
    outAr = out.split(':')
    outAr = ["%02d" % (int(float(x))) for x in outAr]
    out   = ":".join(outAr)
    return out

これは、出力をdd:hh:mm:ss形式で返します。

00:00:00:15
00:00:00:19
02:01:31:40
02:01:32:22

私はこれに年を追加することを考えましたが、出力は1年以上で安全であるため、これは読者のための練習問題として残されています。

>>> str(datetime.timedelta(seconds=99999999))
'1157 days, 9:46:39'

15

ここでOccamのRazorアプローチを真剣に検討します。

td = str(timedelta).split('.')[0]

これはマイクロ秒なしの文字列を返します

datetime.timedeltaオブジェクトを再生成する場合は、次のようにします。

h,m,s = re.split(':', td)
new_delta = datetime.timedelta(hours=int(h),minutes=int(m),seconds=int(s))

2年経って、この言語が大好きです!


5
これは日をカバーしていません
Waschbaer

13

私のdatetime.timedeltaオブジェクトは1日を超えました。だからここにさらなる問題があります。上記の説明はすべて1日未満を想定しています。A timedeltaは実際には、日、秒、マイクロ秒のタプルです。上記の説明はtd.secondsjoeと同じように使用する必要がありますが、日がある場合は秒の値に含まれません。

2つの日時と印刷の日と時間の間の期間を取得しています。

span = currentdt - previousdt
print '%d,%d\n' % (span.days,span.seconds/3600)

これは、将来を見据えたソリューションです。
Jibin 2012


7

上記のJoeの例の値に従って、モジュラス算術演算子を使用します。

td = datetime.timedelta(hours=10.56)
td_str = "%d:%d" % (td.seconds/3600, td.seconds%3600/60)

Pythonの整数除算はデフォルトで切り捨てられることに注意してください。より明示的にしたい場合は、math.floor()またはmath.ceil()を適切に使用してください。


timedeltaは、「print some_timedelta」のように、それ自体をフォーマットする方法をすでに知っています。
joeforker 2009

ええ、でもマイケルが求めていた任意のフォーマット文字列は受け入れられません。今私はそれについて考えていますが、3600ディビジョンmodはうるう秒で問題を引き起こす時間-秒の仮定を行います。
UltraNurd 2009

ええ、でも彼は任意のフォーマット文字列を望んでおらず、ほぼ正確にデフォルトの動作を望んでいます。
joeforker 2009

2
// Python 3000で除算を切り捨てることを忘れないでください
joeforker '12

3
+1、でも//を使用するように回答を編集してみませんか?のtd.total_seconds()代わりに.secondsを使用して、1日を超える間隔で機能させることもお勧めします。
アントニーハッチキンス

4
def seconds_to_time_left_string(total_seconds):
    s = int(total_seconds)
    years = s // 31104000
    if years > 1:
        return '%d years' % years
    s = s - (years * 31104000)
    months = s // 2592000
    if years == 1:
        r = 'one year'
        if months > 0:
            r += ' and %d months' % months
        return r
    if months > 1:
        return '%d months' % months
    s = s - (months * 2592000)
    days = s // 86400
    if months == 1:
        r = 'one month'
        if days > 0:
            r += ' and %d days' % days
        return r
    if days > 1:
        return '%d days' % days
    s = s - (days * 86400)
    hours = s // 3600
    if days == 1:
        r = 'one day'
        if hours > 0:
            r += ' and %d hours' % hours
        return r 
    s = s - (hours * 3600)
    minutes = s // 60
    seconds = s - (minutes * 60)
    if hours >= 6:
        return '%d hours' % hours
    if hours >= 1:
        r = '%d hours' % hours
        if hours == 1:
            r = 'one hour'
        if minutes > 0:
            r += ' and %d minutes' % minutes
        return r
    if minutes == 1:
        r = 'one minute'
        if seconds > 0:
            r += ' and %d seconds' % seconds
        return r
    if minutes == 0:
        return '%d seconds' % seconds
    if seconds == 0:
        return '%d minutes' % minutes
    return '%d minutes and %d seconds' % (minutes, seconds)

for i in range(10):
    print pow(8, i), seconds_to_time_left_string(pow(8, i))


Output:
1 1 seconds
8 8 seconds
64 one minute and 4 seconds
512 8 minutes and 32 seconds
4096 one hour and 8 minutes
32768 9 hours
262144 3 days
2097152 24 days
16777216 6 months
134217728 4 years

これ書いた?どのくらいテストしましたか?
Thomas Ahle

私はdatahaven.netというプロジェクトでこのコードを使用しています。それはかなりうまくいきます。エラーはありましたか?
Veselin Penev

このようなコードの多い答えで少しの情報を提供できればそれは常に素晴らしいです:)それがどのように機能するかの例のように、可能な長所と短所。
Thomas Ahle

1
ああ。承知しました!。あなたのための例を追加しました。:-)
Veselin Penev

スーパー:)また、timedeltaオブジェクトにはフィールドdayssecondsありmicroseconds、ドキュメントによってもわかります。
Thomas Ahle 14

4

職場での残業計算の出力にも同様の問題がありました。値が1日より長く、値が負になる場合でも、値は常にHH:MMで表示されます。表示された解決策のいくつかを組み合わせましたが、おそらく他の誰かがこの解決策を有用だと思っています。timedelta値が負の場合、divmodメソッドを使用して表示されるほとんどの解決策はそのままでは機能しないことに気付きました。

def td2HHMMstr(td):
  '''Convert timedelta objects to a HH:MM string with (+/-) sign'''
  if td < datetime.timedelta(seconds=0):
    sign='-'
    td = -td
  else:
    sign = ''
  tdhours, rem = divmod(td.total_seconds(), 3600)
  tdminutes, rem = divmod(rem, 60)
  tdstr = '{}{:}:{:02d}'.format(sign, int(tdhours), int(tdminutes))
  return tdstr

HHへのタイムデルタ:MM文字列:

td2HHMMstr(datetime.timedelta(hours=1, minutes=45))
'1:54'

td2HHMMstr(datetime.timedelta(days=2, hours=3, minutes=2))
'51:02'

td2HHMMstr(datetime.timedelta(hours=-3, minutes=-2))
'-3:02'

td2HHMMstr(datetime.timedelta(days=-35, hours=-3, minutes=-2))
'-843:02'

4
import datetime
hours = datetime.timedelta(hours=16, minutes=30)
print((datetime.datetime(1,1,1) + hours).strftime('%H:%M'))

2
3.7でAttributeError: 'datetime.timedelta' object has no attribute 'strftime'
qubodup

4

この問題に対する単純なテンプレートフィルター。組み込み関数int()は切り上げません。F-Strings(つまりf '')にはpython 3.6が必要です。

@app_template_filter()
def diffTime(end, start):
    diff = (end - start).total_seconds()
    d = int(diff / 86400)
    h = int((diff - (d * 86400)) / 3600)
    m = int((diff - (d * 86400 + h * 3600)) / 60)
    s = int((diff - (d * 86400 + h * 3600 + m *60)))
    if d > 0:
        fdiff = f'{d}d {h}h {m}m {s}s'
    elif h > 0:
        fdiff = f'{h}h {m}m {s}s'
    elif m > 0:
        fdiff = f'{m}m {s}s'
    else:
        fdiff = f'{s}s'
    return fdiff

3
from django.utils.translation import ngettext

def localize_timedelta(delta):
    ret = []
    num_years = int(delta.days / 365)
    if num_years > 0:
        delta -= timedelta(days=num_years * 365)
        ret.append(ngettext('%d year', '%d years', num_years) % num_years)

    if delta.days > 0:
        ret.append(ngettext('%d day', '%d days', delta.days) % delta.days)

    num_hours = int(delta.seconds / 3600)
    if num_hours > 0:
        delta -= timedelta(hours=num_hours)
        ret.append(ngettext('%d hour', '%d hours', num_hours) % num_hours)

    num_minutes = int(delta.seconds / 60)
    if num_minutes > 0:
        ret.append(ngettext('%d minute', '%d minutes', num_minutes) % num_minutes)

    return ' '.join(ret)

これにより以下が生成されます:

>>> from datetime import timedelta
>>> localize_timedelta(timedelta(days=3660, minutes=500))
'10 years 10 days 8 hours 20 minutes'

長さおよびそれがカバーするものの観点から、私の意見では
最も新しい

1

この関数を確認してください-timedeltaオブジェクトを文字列 'HH:MM:SS'に変換します

def format_timedelta(td):
    hours, remainder = divmod(td.total_seconds(), 3600)
    minutes, seconds = divmod(remainder, 60)
    hours, minutes, seconds = int(hours), int(minutes), int(seconds)
    if hours < 10:
        hours = '0%s' % int(hours)
    if minutes < 10:
        minutes = '0%s' % minutes
    if seconds < 10:
        seconds = '0%s' % seconds
    return '%s:%s:%s' % (hours, minutes, seconds)

1

一発ギャグ。timedeltaはdatetimeのstrftimeを提供しないため、timedeltaをdatetimeに戻し、stftimeを使用します。

これにより、OPが要求するフォーマットHours:Minutesを実現できるだけでなく、要件が別の表現に変更された場合に、datetimeのstrftimeの完全なフォーマット能力を活用できるようになります。

import datetime
td = datetime.timedelta(hours=2, minutes=10, seconds=5)
print(td)
print(datetime.datetime.strftime(datetime.datetime.strptime(str(td), "%H:%M:%S"), "%H:%M"))

Output:
2:10:05
02:10

これにより、timedeltaがHH:MM:SSではなくH:MM:SSとして文字列にフォーマットされるという煩わしさも解決されます。これにより、この問題が発生し、共有した解決策が得られます。


0

すでにtimedelta objがある場合は、そのobjを文字列に変換するだけです。文字列の最後の3文字を削除して印刷します。これにより、秒の部分が切り捨てられ、残りがHours:Minutesの形式で出力されます。

t = str(timedeltaobj) 

print t[:-3]

-3は機能せず、より適切に使用print t.split('.')[0]
EvgenyKolyakov

0

あなたがたまたまIPythonあなたのパッケージに持っているなら(そうすべきです)、それは(とにかく今までのところ)期間(float秒単位)のための非常に素晴らしいフォーマッターを持っています。これは、%%timeセルマジックなど、さまざまな場所で使用されます。私はそれが短期間に生成するフォーマットが好きです:

>>> from IPython.core.magics.execution import _format_time
>>> 
>>> for v in range(-9, 10, 2):
...     dt = 1.25 * 10**v
...     print(_format_time(dt))

1.25 ns
125 ns
12.5 µs
1.25 ms
125 ms
12.5 s
20min 50s
1d 10h 43min 20s
144d 16h 13min 20s
14467d 14h 13min 20s

-3
t1 = datetime.datetime.strptime(StartTime, "%H:%M:%S %d-%m-%y")

t2 = datetime.datetime.strptime(EndTime, "%H:%M:%S %d-%m-%y")

return str(t2-t1)

したがって:

StartTime = '15:28:53 21-07-13'
EndTime = '15:32:40 21-07-13'

戻り値:

'0:03:47'

-10

皆さんの助けに感謝します。私はあなたのアイデアの多くを取り、それらをまとめました、あなたの考えを教えてください。

次のように2つのメソッドをクラスに追加しました。

def hours(self):
    retval = ""
    if self.totalTime:
        hoursfloat = self.totalTime.seconds / 3600
        retval = round(hoursfloat)
    return retval

def minutes(self):
    retval = ""
    if self.totalTime:
        minutesfloat = self.totalTime.seconds / 60
        hoursAsMinutes = self.hours() * 60
        retval = round(minutesfloat - hoursAsMinutes)
    return retval

私のジャンゴではこれを使用しました(合計はオブジェクトであり、辞書にあります):

<td>{{ sum.0 }}</td>    
<td>{{ sum.1.hours|stringformat:"d" }}:{{ sum.1.minutes|stringformat:"#02.0d" }}</td>

少し長いです。私はお勧めします:def hhmm(self):return ':'。join(str(td).split( ':')[:2])<td> {{sum.1.hhmm}} </ td>
joeforker

1
ただでたとえば「2つの日付の違い」に示されているようdivmod()を使用docs.python.org/release/2.5.2/lib/datetime-timedelta.html
トム・
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.