Python常用标准库及第三方库3-日期、时间处理模块

时间处理是编程中一个比较常见的情况,比如转换时间类型:后端接口传参时通常是传递时间戳,前台拿到接口返回值中的时间戳通常需要格式化后再进行展示。在Python中,处理时间的模块有time、datetime。,time模块是Python专门用来处理时间的内建库。它自带了很多方法,可以将不同的时间类型进行相互转换,例如可以将时间戳类型转换为时间元组、时间元组转换为格式化时间、 格式化时间转换为时间戳……,在Python中,通常有这几种方式来表示时间:,时间戳类型可以转换为时间元组、时间元组可以转换为格式化时间、 格式化时间可以转换为时间戳…,Python常用标准库及第三方库3-日期、时间处理模块,时间戳和格式化时间之间,并不能直接相互转换,中间要借助时间元组过度、来进行转换。,datetime是Python中自带的、用来处理时间日期的模块。在Python中表示时间的格式有三种:时间戳、元组、格式化时间。与time模块类似,datetime模块也能够将datetime类型转换成这三种类型。,datetime常用的几大类,分别为:,Python常用标准库及第三方库3-日期、时间处理模块,date类包含三个参数,分别为:year,month,day,返回格式为year-month-day。,datetime.time() 可以传递多个参数:,datetime.timedelta() 类可以传递多个参数,用来表示时间间隔,返回形式为标准时间格式:0:00:00,timeit 模块提供了多种方法,可以用来测量 Python 小段代码执行时间。它既可以在命令行界面直接使用,也可以通过导入模块进行调用。,timeit 模块定义了三个实用函数和一个公共类,分别为timeit.timeit()方法、timeit.repeat()方法、timeit.default_timer()方法、timeit.Timer类。部分源码如下:,从上述源码中可以看出,无论是timeit还是repeat方法,都是先生成Timer对象,然后调用了Timer对象的timeit或repeat函数。,创建一个 Timer 实例,参数分别是:,注:由于 timeit() 正在执行语句,语句中如果存在返回值的话会阻止 timeit() 返回执行时间。timeit() 会取代原语句中的返回值。,创建一个 Timer 实例,参数分别是:,timeit.default_timer()默认的计时器,一般是 time.perf_counter(),time.perf_counter() 方法能够在任一平台提供最高精度的计时器(它也只是记录了自然时间,记录自然时间会被很多其他因素影响,例如计算机的负载)。,timeit.Timer是计算小段代码执行速度的类:,timer = timeit.Timer(stmt=’pass’, setup=’pass’, timer=<timer function>),timer.timeit(number=10),timer.repeat(number=10, repeat=5),构造函数需要的参数有:,前两个参数的默认值都是 ‘pass’,timer 参数是平台相关的;前两个参数都可以包含多个语句,多个语句间使用分号(;)或新行分隔开。,第一次测试语句的时间,可以使用 timeit() 方法;repeat() 方法相当于持续多次调用 timeit() 方法并将结果返回为一个列表。,stmt 和 setup 参数也可以是可供调用但没有参数的对象,这将会在一个计时函数中嵌套调用它们,然后被 timeit() 所执行。注意,由于额外的调用,计时开销会相对略到。,通过”python -m timeit -h”查看帮助信息:,Tool for measuring execution time of small code snippets.,用于测量小代码片段执行时间的工具。,This module avoids a number of common traps for measuring execution,times. See also Tim Peters’ introduction to the Algorithms chapter in,the Python Cookbook, published by O’Reilly.,该模块避免了许多用于测量执行情况的常见陷阱时间。另请参见Tim Peters在由O’Reilly出版的Python Cookbook。,Library usage: see the Timer class.,库用法:请参阅Timer类。,Command line usage:,命令行用法:,python timeit.py [-n N] [-r N] [-s S] [-p] [-h] [–] [statement],Options: 选项:,-n/–number N: how many times to execute ‘statement’ (default: see below),-r/–repeat N: how many times to repeat the timer (default 5),-s/–setup S: statement to be executed once initially (default ‘pass’).,Execution time of this setup statement is NOT timed.,-p/–process: use time.process_time() (default is time.perf_counter()),-v/–verbose: print raw timing results; repeat for more digits precision,-u/–unit: set the output time unit (nsec, usec, msec, or sec),-h/–help: print this usage message and exit,–: separate options from statement, use when statement starts with -,statement: statement to be timed (default ‘pass’),A multi-line statement may be given by specifying each line as a,separate argument; indented lines are possible by enclosing an,argument in quotes and using leading spaces. Multiple -s options are,treated similarly.,多行语句可以通过将每一行指定为独立论证;缩进的行可以通过括起引号中的参数,并使用前导空格。多个-s选项包括类似地处理。,If -n is not given, a suitable number of loops is calculated by trying,successive powers of 10 until the total time is at least 0.2 seconds.,如果未给定-n,则通过尝试直到总时间至少为0.2秒。,Note: there is a certain baseline overhead associated with executing a,pass statement. It differs between versions. The code here doesn’t try,to hide it, but you should be aware of it. The baseline overhead can be,measured by invoking the program without arguments.,注意:执行pass语句。不同版本之间有所不同。这里的代码无法尝试隐藏它,但你应该意识到它。基线开销可以是通过调用不带参数的程序来度量。,Classes:,Timer,Functions:,timeit(string, string) -> float,repeat(string, string) -> list,default_timer() -> float,具体用法:,python timeit.py [-n N] [-r N] [-s S] [-p] [-h] [–] [statement],各个选项的含义:,这种场景主要适用于在接口传参时的时间日期转换,因为在后端接口传参中,一般都是用时间戳进行传递,而不是传统的”2023-02-28 19:11:56″格式。例如当前有一个新增车辆的接口,其中部分字段涉及到时间日期转换:道路运输证有效期止、行驶证有效期止:,Python常用标准库及第三方库3-日期、时间处理模块,在页面上我选择的都是2023-03-31,但在真实的接口传参中,会自动将其转换为时间戳的形式:,Python常用标准库及第三方库3-日期、时间处理模块,时间2023-03-31自动转换为了时间戳1680192000000,我们再通过工具将1680192000000转换为正常的格式化时间看看确实为2023-03-31,转换正确:,时间戳转换网站:​​https://tool.chinaz.com/Tools/unixtime.aspx​​,Python常用标准库及第三方库3-日期、时间处理模块,使用Python进行接口测试或模拟接口调用,也需要传递时间戳,Python中time.time()可以直接获取到当前时间的时间戳,但是获取到的是浮点型的数,可以借助round方法进行四舍五入,然后再*1000,从而精确到毫秒:,将上述代码优化一下,封装成函数,直接进行调用:,同样是模拟接口调用,但是在造数据时,时间字段我想要模拟的不是当前时间,而是指定的日期时间,如三小时前、三天前等。以下分别介绍time模块和datetime模块如何快速模拟指定时间:,我们都知道1小时有3600秒,也就是3600*1000毫秒,所以如果是模拟3小时前的时间戳,则只需要拿到当前时间的时间戳-3600*1000*3即可:,通过站长工具转换时间戳为格式化时间,确实是3个小时前的时间:,Python常用标准库及第三方库3-日期、时间处理模块,使用time模块处理的话需要经过一些计算,而使用datetime模块的timedelta类处理则简单得多,直接填写间隔的时长即可,可以是天、小时、分钟、秒等,获取当前日期时间的三天前的时间戳,整体过程大致分为以下步骤:,这种情况常常用在文件命名上,比如日志文件,通过文件名,可以区分是具体是什么日期时间生成的日志。例如:,生成的日志文件如下:,Python常用标准库及第三方库3-日期、时间处理模块,在之前介绍装饰器的时候,我们有个案例就是通过time模块来统计代码运行时间的,示例如下:,

文章版权声明

 1 原创文章作者:cmcc,如若转载,请注明出处: https://www.52hwl.com/23010.html

 2 温馨提示:软件侵权请联系469472785#qq.com(三天内删除相关链接)资源失效请留言反馈

 3 下载提示:如遇蓝奏云无法访问,请修改lanzous(把s修改成x)

 免责声明:本站为个人博客,所有软件信息均来自网络 修改版软件,加群广告提示为修改者自留,非本站信息,注意鉴别

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023年3月5日 上午12:00
下一篇 2023年3月7日 下午10:34