如何在 Python 中将 datetime.timedelta 转换为分钟、小时? [英] How do I convert datetime.timedelta to minutes, hours in Python?
问题描述
我得到这样的开始日期:
I get a start_date like this:
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
我得到这样的输出:
datetime.timedelta(0, 5, 41038)
如何将其转换为正常时间,如下所示?
How do I convert this into normal time like the following?
10 分钟,1 小时就这样
10 minutes, 1 hour like this
推荐答案
没有用于 timedelta
对象的内置格式化程序,但您可以自己轻松完成:
There's no built-in formatter for timedelta
objects, but it's pretty easy to do it yourself:
days, seconds = duration.days, duration.seconds
hours = days * 24 + seconds // 3600
minutes = (seconds % 3600) // 60
seconds = seconds % 60
或者,等效地,如果您使用的是 Python 2.7+ 或 3.2+:
Or, equivalently, if you're in Python 2.7+ or 3.2+:
seconds = duration.total_seconds()
hours = seconds // 3600
minutes = (seconds % 3600) // 60
seconds = seconds % 60
现在您可以随心所欲地打印它:
Now you can print it however you want:
'{} minutes, {} hours'.format(minutes, hours)
例如:
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)
这将打印:
9 minutes, 50 hours
如果您想获得10 分钟 1 小时"而不是10 分钟 1 小时",您也需要手动执行此操作:
If you want to get "10 minutes, 1 hour" instead of "10 minutes, 1 hours", you need to do that manually too:
print '{} minute{}, {} hour{}'.format(minutes, 's' if minutes != 1 else '',
hours, 's' if minutes != 1 else '')
或者您可能想要编写一个 english_plural
函数来为您处理 's'
位,而不是重复自己.
Or you may want to write an english_plural
function to do the 's'
bits for you, instead of repeating yourself.
从您的评论来看,您似乎真的想将日子分开.那就更简单了:
From your comments, it sounds like you actually want to keep the days separate. That's even easier:
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
如果要将其转换为单个值以存储在数据库中,然后将该单个值转换回以对其进行格式化,请执行以下操作:
If you want to convert this to a single value to store in a database, then convert that single value back to format it, do this:
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
所以,把它放在一起:
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)
这篇关于如何在 Python 中将 datetime.timedelta 转换为分钟、小时?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!