datetime
模块之前整理了Python最最基本的关于时间的time
模块,但是,要搞清楚128天前是几月几号或现在距离2023年1月20日还有几天等这类问题,用time
模块还是比较繁琐的。datetime
模块能以更方便的格式显示日期或对日期进行运算。
datetime
模块定义了5个关于日期时间的类,
datetime.datetime
:表示日期时间的类datetime.timedelta
:表示时间间隔的类datetime.date
:表示日期的类datetime.time
:表示时间的类datetime.tzinfo
:时区相关的类大部分的常见操作都是使用datetime
和timedelta
类,下面是这两个类的常见操作小结。
datetime
类datetime.datetime
类对应的实例对象代表某一个时刻,这个对象包含年、月、日、时、分、秒、微秒等属性。也就是说一旦获取了特定时刻的datetime对象,获取年、月、日、时、分、秒、微秒就轻而易举了!
构造datetime.datetime
对象便是创建一个时刻,常见的创建方法主要有如下三种:
from datetime import datetime
dt = datetime.now() # 获取当前的日期和时间
dt
output:
datetime.datetime(2022, 8, 7, 17, 5, 5, 313337)
创建了datetime
对象后,顺便提一下用法,可以通过以下属性单独获取年月日等信息,十分方便。
dt.year
dt.month
dt.day
dt.hour
dt.minute
dt.second
from datetime import datetime
nationalDay = datetime(2023,10,1,0,0,0)
from datetime import datetime
import time
dt = datetime.fromtimestamp(time.time())
见下文:
三、datetime与字符串\2.字符串转datetime
datetime类型的对象是支持比较的,较后的时刻比较前的时刻更“大”。
from datetime import datetime
laborDay = datetime(2023,5,1,0,0,0)
nationalDay = datetime(2023,10,1,0,0,0)
# 2023年的五一劳动节要早于国庆节,返回 True
laborDay < nationalDay
output:
True
from datetime import datetime
import time
nationalDay = datetime(2022,10,1,0,0,0)
while datetime.now() < nationalDay:
time.sleep()
print("国庆节快乐!")
timedelta
类datetime.timedelta
类对于的实例表示时间间隔。比如我们要像计算再过123天之后是几月几号,这里的123天便是一个时间间隔。具体实现如下
import datetime
# 构造一个123天的时间间隔
deltaDays = datetime.timedelta(days = 123)
# 获取今天的时间(注:文本代码运行日期:2022年8月8日)
today = datetime.datetime.now()
# 在今天的时刻 + 时间间隔123天
today + deltaDays
output:
datetime.datetime(2022, 12, 9, 7, 7, 19, 120988)
从上面的列子中,可以体会到datetime
模块在日期计算中的强大功能,要想实现日期计算,需要创建起始时间的datetime
对象(上文中已介绍)以及时间间隔对象timedelta
对象。
datetime.timedelta
类的构造方法timedelta()
函数接收关键字参数weeks
、days
、hours
、minutes
、seconds
、milliseconds
和microseconds
。注意,时间间隔的创建没有月months
和年years
,主要是因为年月是可变时间,依赖于特定的月份和年份。
# 构造一个12天9小时10分钟6秒的时间长度对象
delta = datetime.timedelta(days = 12 ,hours = 9,minutes = 10,seconds = 6)
timedelta对象的对应时长可以以天、秒、微秒三种方式来获取。对于的属性分别是days
、seconds
、microseconds
。
delta.days , delta.seconds , delta.microseconds
# output: (12, 33006, 0)
也可以调用total_seconds()
方法来获取以秒为单位的总时长。
delta.total_seconds()
# output: 1069806.0
即:
delta.total_seconds() == delta.days + delta.seconds + delta.microseconds
# 返回 True
datetime类型的数据在日期时间计算上十分的方便,但在人阅读上不是特别友好,转成便于阅读的字符串格式也是常见的操作。
利用datetime
类的实例方法strftime()
可以轻松转为格式化的字符串,其中f
便是format,格式化的意思。具体使用的适合需要传入定制的格式化字符串。
import datetime
nowdt = datetime.datetime.now()
nowdt.strftime('%Y/%m/%d %H:%M:%S')
output:
'2022/08/08 09:38:44'
定制格式化字符串的指令含义:
指令 | 含义说明 | 列 |
---|---|---|
%a |
简写周几 | Sun, Mon, …, Sat |
%A |
完整周几 | Sunday, Monday, …, Saturday |
%w |
一周中的第几天 | 0, 1, …, 6 |
%d |
一月中的第几天 | 01, 02, …, 31 |
%b |
简写月份 | Jan, Feb, …, Dec |
%B |
完整月份 | January, February, …, December |
%m |
月份(数字) | 01, 02, …, 12 |
%y |
不带世纪的年份(1970至2069) | 00, 01, …, 99 |
%Y |
带世纪的年份(如2022) | 0001, 0002, …, 2021, 2022, …, 9998, 9999 |
%H |
小时(24小时制) | 00, 01, …, 23 |
%I |
小时(12小时制) | 01, 02, …, 12 |
%p |
AM 或 PM | AM, PM |
%M |
分(数字) | 00, 01, …, 59 |
%S |
秒(数字) | 00, 01, …, 59 |
%f |
微妙(6位数字). | 000000, 000001, …, 999999 |
%% |
'%' 字符 |
% |
可以尝试其他不同的字符串输出
nowdt.strftime('%B of %y')
# output : 'August of 22'
nowdt.strftime('%I:%M %p')
# output : '09:38 AM'
利用datetime
类的静态方法strptime()
可以轻松转为格式化的字符串,其中p
便是parse,解析的意思,即从对于字符串格式中解析出日期时间数据。
datetime.datetime.strptime('2022年8月8日','%Y年%m月%d日')
# output : datetime.datetime(2022, 8, 8, 0, 0)
datetime.datetime.strptime('2014年6月30日18点34分','%Y年%m月%d日%H点%M分')
# output : datetime.datetime(2014, 6, 30, 18, 34)
time
模块和datetime
模块都是Python中关于时间的内置模块,time
模块更加基础、底层,datetime
模块则更易用,充分体现出了Python的简洁优雅!当然Python还有其他更加高效的时间相关第三方模块,后续有机会再整理。