datetime.timedelta
在time库中,支持时间的运算。而datetime库也给我们提供了日期的运算。其中,计算过去或者将来的时间会用到datetime.timedelta类。datetime.timedelta的内部值按日,秒,微秒存储。
构造函数
首先,我们来看看其构造函数的详细定义:
def __new__(cls, days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0):
可以看出来,datetime.timedelta的构造方法,就是用来构造天,时,分,秒的。简单的说,它就是计算中的参数,比如要计算减去一天后的日期,就要创建一个一天长度的datetime.timedelta对象。
日期运算
既然了解了datetime.timedelta就是一个中间参数。下面,我们来进行日期的加减法运算,具体代码如下:
import datetime today = datetime.date.today() print("今天日期:", today) one_day = datetime.timedelta(days=1) yesterday = today - one_day tomorrow = today + one_day print("昨天日期", yesterday) print("明天日期", tomorrow) print("昨天与明天相差{0}天", (yesterday - tomorrow).days) print("明天与昨天相差{0}天", tomorrow - yesterday)
运行之后,效果如下:
比较日期
在实际的应用中,我们除了会计算日期相差的时间之外,我们还可能会比较两个日期的大小。话不多说,我们直接代码学习:
import datetime # 日期比较 d1 = datetime.date.today() d2 = d1 + datetime.timedelta(days=1) print(d1 > d2) # 时间比较 t1 = datetime.time(19, 20, 20) t2 = datetime.time(18, 20, 20) print(t1 > t2)
运行之后,效果如下:
计算秒数
在我们没有完全掌握datetime库之前,我们会怎么计算秒数?
当然是直接计算,比如1小时的秒数计算,我们会乘以3600。其他时间依次类推。但其实datetime.timedelta有一个非常简单的直接秒数转换函数:total_seconds()。
详细使用方式如下:
import datetime timeD = datetime.timedelta(days=1) print(timeD.total_seconds())
这里,我们计算了一天的秒数,效果如下:
datetime.datetime
其实,datetime库下面还有一个datetime类,该类可以存储由日期和时间分量构成的值。与前面的datetime.date与datetime.time有本质的区别,datetime.datetime是前面两者的结合,即有日期也有时间。
我们先来获取一下,我们常用的时间数值:
import datetime print("当前时间:",datetime.datetime.now()) print("当前时间:",datetime.datetime.today()) print("UTC时间:",datetime.datetime.utcnow()) date_str = ["year", "month", "day", "hour", "minute", "second", "microsecond", ] now = datetime.datetime.now() for attr in date_str: print("{0}:{1}".format(attr, getattr(now, attr)))
这里,我们通过反射获取到了时间的各个值。控制台输出如下:
combine()
既然datetime库提供了单独的时间以及单独的日期类,那么肯定有函数能将日期与时间进行组合。没错,datetime.daetime.combine()函数就能实现日期与时间的组合。具体代码如下:
import datetime t = datetime.time(19, 20, 20) d = datetime.date.today() td = datetime.datetime.combine(d, t) print(td)
运行之后,时间与日期就组合成功。
至于其他常用的函数,如下表所示:
方法名 | 参数 | 意义 |
fromisocalendar() | 提供3个参数:年,第几星期,第几天 |
返回指定的日期时间(因为没提供时间所以时间为00:00:00) |
isoformat() | 1个datetime.datetime参数 | 返回ISO格式的日期UTC字符串 |
utcfromtimestamp() | 1个time.time()类型的参数 | 返回UTC日期时间 |
utctimetuple() | 1个datetime.datetime参数 | 返回struct_time结构体时间 |
timestamp() | 1个datetime.datetime参数 | 返回datetime的时间戳 |
fromisoformat() | 1个日期时间字符串 | 返回datetime.daetime对象时间 |
ctime() | 1个datetime.datetime参数 | 返回英文格式的时间字符串 |
time() | 1个datetime.datetime参数 | 返回指定日期的时间 |
isoweekday() | 1个datetime.date参数 | 返回星期几[1-7] |
strftime() | 2个参数,一个datetime.datetime参数,一个格式字符串 | 转换为指定格式的日期时间格式 |
strptime() | 2个参数,一个日期时间字符串,一个日期时间格式 | 将格式化的字符串转换为datatime.datetime实例 |
isocalendar() | 1个datetime.date参数 | 返回一个 3 元组 (ISO 年份, ISO 周序号, ISO 周日期)。 |
toordinal() | 1个datetime.date参数 | 返回日期的多边格里高利度序数,其中1年1月1日具有序数1。如果1年1月1日具有序数1,则1年1月2日将具有序数2,依此类推。 |
fromordinal() | 1个整型数字 | 返回多边格里高利度序数对应的日期datetime.datetime对象 |
weekday() | 1个datetime.date参数 | 返回星期几,[0-6] |
date() | 1个datetime.datetime参数 | 返回日期值 |
timetz() | 1个datetime.datetime参数 | 此方法的返回类型是具有相同时,分,秒,微秒,倍数和tzinfo的时间对象。 |
测试代码如下:
import datetime import time #返回日期值 print(datetime.datetime.date(datetime.datetime.now())) #返回星期几,[0-6] print(datetime.datetime.weekday(datetime.date.today())) #返回日期的多边格里高利度序数,其中1年1月1日具有序数1。如果1年1月1日具有序数1,则1年1月2日将具有序数2,依此类推。 print(datetime.datetime.toordinal(datetime.date.today())) #返回多边格里高利度序数对应的日期datetime.datetime对象 print(datetime.datetime.fromordinal(123)) #返回一个 3 元组 (ISO 年份, ISO 周序号, ISO 周日期)。 print(datetime.datetime.isocalendar(datetime.date.today())) #将格式化的字符串转换为datatime.datetime实例 print(datetime.datetime.strptime("Mon Apr 12 14:13:S 2021", "%a %b %d %H:%M:S %Y")) # 转换为指定格式的日期时间格式 print(datetime.datetime.strftime(datetime.datetime.now(), "%a %b %d %H:%M:S %Y")) # 返回星期几,值为[1-7] print(datetime.datetime.isoweekday(datetime.date.today())) # 返回当前时间 print(datetime.datetime.time(datetime.datetime.now())) # 返回英文格式的时间字符串 print(datetime.datetime.ctime(datetime.datetime.now())) # 返回ISO格式的日期UTC字符串 print(datetime.datetime.isoformat(datetime.datetime.now())) # 返回指定的日期时间(因为没提供时间所以时间为00:00:00) print(datetime.datetime.fromisocalendar(2020, 6, 6)) # 返回datetime.daetime对象时间 print(datetime.datetime.fromisoformat("2020-01-01 13:00:00")) # 返回struct_time结构体时间 print(datetime.datetime.utctimetuple(datetime.datetime.now())) # 返回UTC日期时间 print(datetime.datetime.utcfromtimestamp(time.time())) # 返回datetime的时间戳 print(datetime.datetime.timestamp(datetime.datetime.now()))
运行之后,效果如下:
astimezone(时区)
在datetime.datetime中,时区是由tzinfo的子类表示。由于tzinfo是一个抽象类,实际使用时,应该需要定义它的子类,并为一些方法提供适当的实现。
具体使用方法如下:
import datetime one = datetime.timezone(datetime.timedelta(hours=-6)) two = datetime.timezone(datetime.timedelta(hours=6)) d = datetime.datetime.now(one) print(d) print(d.astimezone(datetime.timezone.utc)) print(d.astimezone(two)) print(d.astimezone())
运行之后,效果如下:
这里不同的时区,就是通过加减时间决定的。而控制台输出的±后面的值,都是相对于UTC而言。daetime库的讲解到这里就全部讲解完成了,相信只要认真看完本篇,对于日期,时间的操作,想必手到擒来。