Python3 进阶|日期和时间操作汇总
点击这里,边看视频讲解,边学习以下内容
Python中,对日期和时间的操作,主要使用这3个内置模块: datetime 、 time 和 calendar
开发程序时,经常需要获取两个代码位置在执行时的时间差,比如,我们想知道某个函数执行大概耗费了多少时间,就可以使用time.time()来做。
import time before = time.time() func1() after = time.time() print(f"调用func1,花费时间{after-before}")
time.time() 会返回 从 1970年1月1日0点(所谓的epoch时间点) 到 当前时间的 经过的秒数 ,可以简称为秒数时间。 关于该函数的详细解释,请点击这里参考官方文档
点击这里,边看视频讲解,边学习以下内容
以指定格式字符串显示时间,是非常常用的,比如日志里面的时间戳。
要得到 当前时间
对应的字符串,可以这样实现:
from datetime import datetime str(datetime.now())
得到类似这样的字符串:‘2018-06-30 23:10:08.911420’
如果要指定输出的时间格式,可以像下面这样
datetime.now().strftime('%Y-%m-%d ** %H:%M:%S')
得到类似这样的字符串: ‘2019-02-24 ** 16:56:55’
当然,也可以使用time库来格式化显示字符串
time.strftime('%Y-%m-%d %H:%M:%S',time.localtime())
如果要将某个指定秒数时间(从epoch时间点开始计算),而不是当前时间,转化为字符串格式,可以这样写
time.strftime('%Y%m%d %H:%M:%S',time.localtime(1434502529))
反过来,如果要将字符串指定的时间,转化为秒数时间,可以这样
int(time.mktime(time.strptime('2015-08-01 23:59:59', '%Y-%m-%d %H:%M:%S')))
有的时候,我们的程序获取的时间是 ISO 8601 格式的字符串。
比如:
2008-09-03T20:56:35.450686+00:00 2008-09-03T20:56:35.450686Z
可以通过如下方法转化为 本地格式
import dateutil.parser # 字符串时间 转化为 datetime 对象 dt = dateutil.parser.isoparse('2008-09-03T20:56:35.450686+00:00') # 转化为本地时区的 datetime 对象 localdt = dt.astimezone(tz=None) # 产生本地格式 字符串 localdt.strftime('%Y-%m-%d %H:%M:%S')
要获取 当前时间
的 年、月、日、时、分、秒、星期几 对应的数字,可以使用datetime库
>>> from datetime import datetime >>> datetime.now() datetime.datetime(2018, 6, 30, 23, 3, 54, 238947) # 年 >>> datetime.now().year 2018 # 月 >>> datetime.now().month 6 # 日 >>> datetime.now().day 30 # 时 >>> datetime.now().hour 23 # 分 >>> datetime.now().minute 7 # 秒 >>> datetime.now().second 58 # 毫秒 >>> datetime.now().microsecond 151169 # 获取星期几用 weekday方法 # 0 代表星期一,1 代表星期二 依次类推 >>> datetime.now().weekday() 5
如果要获取的是 某个指定时间,比如 “2018-6-24”,而不是当前时间,对应的星期几,怎么办?
可以使用 datetime类的 strptime方法,先产生对应的 datetime对象
# 要计算出 2018年6月24日 是星期几 thatDay = "2018-6-24" from datetime import datetime # 先把字符串表示的日期转化为 datetime 对象 theDay = datetime.strptime(thatDay, "%Y-%m-%d") #再获取星期几 theDay.weekday()
如果我们想知道,2018年6月24日 往后推120天,是什么日期?星期几?
往前推120天,又是什么日期?星期几?
可以这样计算
thatDay = "2018-6-24" from datetime import datetime,timedelta theDay = datetime.strptime(thatDay, "%Y-%m-%d").date() # 后推120天 就是 + timedelta(days=120) target = theDay + timedelta(days=120) print(target) print(target.weekday()) # 前推120天 就是 - timedelta(days=120) target = theDay - timedelta(days=120) print(target) print(target.weekday())
thatDay = "2018-6-30" from datetime import datetime,timedelta theDay = datetime.strptime(thatDay, "%Y-%m-%d").date() # 这就是 2018-6-30 那一周的周一 weekMonday = theDay - timedelta(days=theDay.weekday())
最方便的方法是使用 calendar 模块里面的 函数
from calendar import monthrange # monthrange返回的是元组 # 第一个元素是指定月第一天是星期几 # 第二个元素是指定月有多少天 mr = monthrange(2011, 2) # 得到2011年2月有多少天 print(mr[1])
关于 calendar 的详细用法,参考官网