shixiaoxun

基本的日期与时间转换

问题


       你需要执行简单的时间转换,比如天到秒,小时到分钟等的转换。


解决方案


       为了执行不同时间单位的转换和计算,请使用 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

分类:

技术点:

相关文章: