python中,有两个模块用来表示时间,一个是time模块,一个是datetime模块。之前我们讲述过time模块怎么使用时间,这篇我们看下datetime模块怎么表达时间。
datetime类型是一个比较综合的类型,它下面有子包datetime.date专门用来表示日期,datetime.time专门用来表示时间,而datetime.datetime就表示日期时间,其中还有datetime.datetime.now()和datetime.datetime.today()来表示当前时间,这点和time.time(), time.localtime()表示当前时间是类似的。
1. datetime.date():这是一个构造函数,需要传参年,月,日的值来构造一个日期
d1 = datetime.date(2025, 1, 2)
print('新构造的日期是:', d1)
输出:
新构造的日期是: 2025-01-02
2. datetime.time(): 这也是一个构造函数,需要传参时、分、秒的值来构造一个时间
t1 = datetime.time(12, 22, 29)
print('新构造的时间是:', t1)
输出:
新构造的时间是: 12:22:28
3. datetime.datetime(): 这同上,需要分别传参年、月、日、时、分、秒来构造一个日期时间
dt1 = datetime.datetime(2025, 1, 2, 12, 25, 29)
print('新构造的日期时间是:', dt1)
输出:
新构造的日期时间是: 2025-01-02 12:25:29
4. datetime模块的时间格式化和反格式化,分别用到datetime.strftime()和datetime.strptime()函数
ft = dt1.strftime('%Y-%m-%d %H:%M:%S')
print('字符串时间是:', ft)
o_dt = datetime.datetime.strptime(ft, '%Y-%m-%d %H:%M:%S')
print('从字符串转换为datetime: ', o_dt)
输出:
字符串时间是: 2025-01-02 12:25:29
从字符串转换为datetime类型: 2025-01-02 12:25:29
5. datetime模块的时间序列【时间元组】
例子:
dt_tuple = dt1.timetuple() # 就直接用timetuple()获取时间序列
dt1_tuple = datetime.datetime.timetuple(dt1) # 这种方式也能获取时间序列
print('时间序列/元组是:', dt_tuple, '\n', dt1_tuple)
输出:
时间序列/元组是: time.struct_time(tm_year=2025, tm_mon=1, tm_mday=2, tm_hour=12, tm_min=25, tm_sec=29, tm_wday=3, tm_yday=2, tm_isdst=-1)
time.struct_time(tm_year=2025, tm_mon=1, tm_mday=2, tm_hour=12, tm_min=25, tm_sec=29, tm_wday=3, tm_yday=2, tm_isdst=-1)
还可以获取时间序列/元组里的值。如dt_tuple.tm_mon就会返回月份值1,dt_tuple.tm_wday返回3即周四。
tm_mon = dt_tuple.tm_mon
print('月份为:', tm_mon)
tm_wday = dt1_tuple.tm_wday
print('星期为:', int(tm_wday)+1)
tm_yday = dt1_tuple.tm_yday
print(f'%s 是一年中的第 %d 天' % (ft, tm_yday))
输出:
月份为: 1
星期为: 4
2025-01-02 12:25:29 是一年中的第 2 天
6. 1)strftime() 格式化时间--字符串的日期时间对象
strftime()是在date, datetime, time类下定义的。该方法根据给定的日期、日期时间和时间创建格式化的字符串。
print(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'))
print(datetime.date.today().strftime('%b %d %Y'))
print(datetime.time(18, 48, 32).strftime('%H:%M:%S'))
输出:
2025-01-02 14:10:21
Jan 02 2025
18:48:32
2) strptime()---将字符串类型转换为时间类型【即datetime类型】
date_str = '14 Nov, 2022'
date_obj = datetime.datetime.strptime(date_str, '%d %b, %Y')
print(date_obj)
print(type(date_obj))
输出:
2022-11-14 00:00:00
7. datetime和time之间的转换:只要借助时间元组【即时间序列】,即可实现这两者之间的转换。先让时间格式化为字符串,然后利用time.strptime(string_time,format)把字符串转换为时间元组,这时就是time模块的时间了,接着再利用time模块的其他函数,比如time.mktime(localtime)转换为时间戳等等。
now = datetime.datetime.now()
str_t = now.strftime('%Y-%m-%d %H:%M:%S')
print('字符串时间为:', str_t)
# 以字符串时间为中间形式,借助time.strptime()转为time模块的时间元组
o_dt = time.strptime(str_t, '%Y-%m-%d %H:%M:%S')
print('字符串时间转为时间元组:', o_dt)
time_chuo = time.mktime(o_dt) # 借助time.mktime()把时间元组转为时间戳
print('转为时间戳:', time_chuo)
输出:
格式化后的字符串: 2025-01-02 14:46:17
转为时间: time.struct_time(tm_year=2025, tm_mon=1, tm_mday=2, tm_hour=14, tm_min=46, tm_sec=17, tm_wday=3, tm_yday=2, tm_isdst=-1)
转为时间戳: 1735800377.0
now_tuple = now.timetuple()
now_chuo = time.mktime(now_tuple)
print('从时间序列转换为时间戳:', now_chuo)
输出:
从时间序列转换为时间戳: 1735800977.0
上图中,先利用timetuple()函数取得时间序列,然后借助time.mktime()函数转换为时间戳,也可以实现datetime和time之间的相互转换。
8. datetime.now()类:
# 获取当前的年、月份
print(datetime.datetime.now().date())
输出:
2025-01-02
# 获取每个时间的序列
print(datetime.datetime.now().timetuple())
# 获取月份
print(datetime.datetime.now().timetuple().tm_mon)
# 时间类型转为字符串类型
date_str = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
print(date_str)
# 在当前日期里加上2天,打印出来,注意模块的使用,优先级的混淆
print(datetime.datetime.now().date() + datetime.timedelta(days=2))
# 在现在的时间里面向后推迟2小时
print(datetime.datetime.now() + datetime.timedelta(hours=2))
输出:
time.struct_time(tm_year=2025, tm_mon=1, tm_mday=2, tm_hour=15, tm_min=42, tm_sec=59, tm_wday=3, tm_yday=2, tm_isdst=-1)
1
2025-01-02 15:42:59
2025-01-04
2025-01-02 17:42:59.058140
9. datetime.timedelta:timedelta对象表示两个日期或时间的时间差。
# 创建了两个timedelta对象t1和t2,打印相差的时间
t1 = datetime.timedelta(weeks=2, days=5, hours=1, seconds=33)
t2 = datetime.timedelta(days=4, hours=11, minutes=4, seconds=54)
t3 = t1 - t2
print(t3)
>> 14 days, 13:55:39
t1 = datetime.timedelta(seconds = 33)
t2 = datetime.timedelta(seconds = 54)
t3 = t1 - t2
print("t3 =", t3)
>> t3 = -1 day, 23:59:39
# 使用total_seconds()方法获得timedelta对象中的总秒数
t = datetime.timedelta(days=5, hours=1, seconds=33, microseconds=233423)
print("total seconds =", t.total_seconds())
>> total seconds = 435633.233423
# 求出上一个月的最后一天日期,就用这个月的第一天减1天,这个里面的参数可以改动,默认为月份初始化天
f=datetime.date(day=1, month=datetime.date.today().month, year=datetime.date.today().year) - datetime.timedelta(days=1)
print(f)
>> 2022-10-31