基本的日期与时间转换
问题
你需要执行简单的时间转换,比如天到秒,小时到分钟等的转换。
解决方案
为了执行不同时间单位的转换和计算,请使用 datetime 模块。比如,为了表示一个时间段,可以创建一个 timedelta 实例,就像下面这样:
from datetime import timedelta a=timedelta(days=2,hours=6) print(a) # 2 days, 6:00:00 b=timedelta(hours=4.5) c=a+b print(c) # 2 days, 10:30:00
如果你想表示指定的日期和时间,先创建一个 datetime 实例然后使用标准的数学运算来操作它们。比如:
from datetime import datetime, timedelta a = datetime(2020, 12, 23) print(a + timedelta(days=10)) # 2021-01-02 00:00:00 b = datetime(2021, 6, 7) d = b - a print(d.days) # 166 now = datetime.today() print(now) # 2020-12-23 08:51:08.540736 print(now + timedelta(minutes=100)) # 2020-12-23 10:31:08.540736
在计算的时候,需要注意的是 datetime 会自动处理闰年。比如:
e = datetime(2021, 3, 1) f = datetime(2021, 2, 28) print(e - f) # 1 day, 0:00:00 print((e - f).days) # 1
讨论
对大多数基本的日期和时间处理问题,datetime 模块已经足够了。如果你需要执行更加复杂的日期操作,比如处理时区,模糊时间范围,节假日计算等等,可以考虑使用 dateutil 模块。
许多类似的时间计算可以使用 dateutil.relativedelta() 函数代替。但是,有一点需要注意的就是,它会在处理月份 (还有它们的天数差距) 的时候填充间隙。看例子最清楚:
a = datetime(2020, 12, 23) # print(a + timedelta(months=1)) # 报错,timedelta里没有months参数 from dateutil.relativedelta import relativedelta print(a + relativedelta(months=+1)) # 2021-01-23 00:00:00 b = datetime(2021, 6, 7) c = b - a print(c) # 166 days, 0:00:00 d = relativedelta(b, a) print(d) # relativedelta(months=+5, days=+15) print(d.months) # 5