如何在Python中将datetime.timedelta转换为分钟,小时?

use*_*957 43 python django

我得到一个这样的start_date:

from django.utils.timezone import utc
import datetime

start_date = datetime.datetime.utcnow().replace(tzinfo=utc)
end_date = datetime.datetime.utcnow().replace(tzinfo=utc)
duration = end_date - start_date
Run Code Online (Sandbox Code Playgroud)

我得到这样的输出:

datetime.timedelta(0, 5, 41038)
Run Code Online (Sandbox Code Playgroud)

如何将此转换为正常时间,如下所示?

这样10分钟,1小时

aba*_*ert 91

没有内置的timedelta对象格式化程序,但它很容易自己做:

days, seconds = duration.days, duration.seconds
hours = days * 24 + seconds // 3600
minutes = (seconds % 3600) // 60
seconds = seconds % 60
Run Code Online (Sandbox Code Playgroud)

或者,等效地,如果您使用的是Python 2.7+或3.2+:

seconds = duration.total_seconds()
hours = seconds // 3600
minutes = (seconds % 3600) // 60
seconds = seconds % 60
Run Code Online (Sandbox Code Playgroud)

现在您可以随意打印:

'{} minutes, {} hours'.format(minutes, hours)
Run Code Online (Sandbox Code Playgroud)

例如:

def convert_timedelta(duration):
    days, seconds = duration.days, duration.seconds
    hours = days * 24 + seconds // 3600
    minutes = (seconds % 3600) // 60
    seconds = (seconds % 60)
    return hours, minutes, seconds
td = datetime.timedelta(2, 7743, 12345)
hours, minutes, seconds = convert_timedelta(td)
print '{} minutes, {} hours'.format(minutes, hours)
Run Code Online (Sandbox Code Playgroud)

这将打印:

9 minutes, 50 hours
Run Code Online (Sandbox Code Playgroud)

如果你想得到"10分钟,1小时"而不是"10分钟,1小时",你也需要手动完成:

print '{} minute{}, {} hour{}'.format(minutes, 's' if minutes != 1 else '',
                                      hours, 's' if minutes != 1 else '')
Run Code Online (Sandbox Code Playgroud)

或者你可能想写一个english_plural函数's'为你做位,而不是重复自己.

从你的评论中,听起来你真的想把日子分开.这更容易:

def convert_timedelta(duration):
    days, seconds = duration.days, duration.seconds
    hours = seconds // 3600
    minutes = (seconds % 3600) // 60
    seconds = (seconds % 60)
    return days, hours, minutes, seconds
Run Code Online (Sandbox Code Playgroud)

如果要将此转换为单个值以存储在数据库中,然后将该单个值转换回格式化,请执行以下操作:

def dhms_to_seconds(days, hours, minutes, seconds):
    return (((days * 24) + hours) * 60 + minutes) * 60 + seconds

def seconds_to_dhms(seconds):
    days = seconds // (3600 * 24)
    hours = (seconds // 3600) % 24
    minutes = (seconds // 60) % 60
    seconds = seconds % 60
    return days, hours, minutes, seconds
Run Code Online (Sandbox Code Playgroud)

所以,把它放在一起:

def store_timedelta_in_database(thingy, duration):
    seconds = dhms_to_seconds(*convert_timedelta(duration))
    db.execute('INSERT INTO foo (thingy, duration) VALUES (?, ?)',
               thingy, seconds)
    db.commit()

def print_timedelta_from_database(thingy):
    cur = db.execute('SELECT duration FROM foo WHERE thingy = ?', thingy)
    seconds = int(cur.fetchone()[0])
    days, hours, minutes, seconds = seconds_to_dhms(seconds)
    print '{} took {} minutes, {} hours, {} days'.format(thingy, minutes, hours, days)
Run Code Online (Sandbox Code Playgroud)


Ada*_*eld 16

A datetime.timedelta对应于两个日期之间的差异,而不是日期本身.它仅以天,秒和微秒表示,因为较大的时间单位如月和年不能干净地分解(30天1个月或0.9677个月?).

如果要将a转换timedelta为小时和分钟,可以使用该total_seconds()方法获取总秒数,然后进行一些数学计算:

x = datetime.timedelta(1, 5, 41038)  # Interval of 1 day and 5.41038 seconds
secs = x.total_seconds()
hours = int(secs / 3600)
minutes = int(secs / 60) % 60
Run Code Online (Sandbox Code Playgroud)


wom*_*ire 9

如果我们只需要打印表单的字符串,则不需要自定义帮助程序函数[D day[s], ][H]H:MM:SS[.UUUUUU].timedelta对象支持str()执行此操作的操作.它甚至可以在Python 2.6中运行.

>>> from datetime import timedelta
>>> timedelta(seconds=90136)
datetime.timedelta(1, 3736)
>>> str(timedelta(seconds=90136))
'1 day, 1:02:16'
Run Code Online (Sandbox Code Playgroud)

  • 除了问题的奇怪输出格式要求(我认为这并不是真正的要求,只是OP在表达自己时遇到问题)之外,这应该是公认的答案。 (3认同)

C.K*_*.K. 6

我认为计算自己不是一个好主意。

如果您只想要一个漂亮的输出,只需将其转换strstr()函数或直接转换即可print()

如果还有进一步使用小时和分钟,您可以将其解析为datetime对象使用datetime.strptime()(并使用datetime.time()mehtod提取时间部分),例如:

import datetime

delta = datetime.timedelta(seconds=10000)
time_obj = datetime.datetime.strptime(str(delta),'%H:%M:%S').time()
Run Code Online (Sandbox Code Playgroud)