一、问题背景

最近有小伙伴反馈接口平台的测试计划执行耗时显示有误,比如执行实际时长超过10s,但是报告中显示总耗时小于1s

显示耗时统计出现问题

二、问题排查

开始和结束时间是否有误
开始时间:

2022-04-24 10:51:23.677632

结束时间:

2022-04-24 10:51:35.713161

可见起止的时间获取没有问题

计算方式

round((end_time-start_time).microseconds/1000000, 2)

计算结果0.04s

接下来看看为什么这样的计算方式出错

三、datetime

datetime模块可以生成所需日期和时间的字符串,还可以进行时间差计算

3.1 时间差计算

import datetime
datetime.datetime.now()
# 生成一个datetime.datetime对象,包含了年、月、日、时、分、秒、毫秒七个参数
# 可以直接获取年、月、日等数值:
t = datetime.datetime.now()print(t.year, t.month, t.day, t.hour, t.minute, t.second, t.microsecond)
print(type(t.year), type(t.month), type(t.day), type(t.hour), type(t.minute), type(t.second), type(t.microsecond))# output:
2022 4 24 11 3 25 336771
<class 'int'> <class 'int'> <class 'int'> <class 'int'> <class 'int'> <class 'int'> <class 'int'>

3.2 时间和日期的获取

# 可以分别获得日期,时间:
print(t.date(), type(t.date()))
print(t.time(), type(t.time()))
# output:
2022-04-24 <class 'datetime.date'>
11:06:50.314211 <class 'datetime.time'>

3.3 格式化输出字符串

可以按照需要格式化输出字符串:datetime.datetime.strftime("format")

指令 意义 示例
%a 当地工作日的缩写 Sun, Mon, …, Sat
%A 当地工作日的全名 Sunday, Monday, …, Saturday
%w 以十进制数显示的工作日,其中0表示星期日,6表示星期六 0, 1, …, 6
%d 补零后,以十进制数显示的月份中的一天 01, 02, …, 31
%b 当地月份的缩写 an, Feb, …, Dec
%B 当地月份的全名 January, February, …, December
%m 补零后,以十进制数显示的月份 01, 02, …, 12
%y 补零后,以十进制数表示的,不带世纪的年份 00, 01, …, 99
%Y 十进制数表示的带世纪的年份 0001, 0002, …, 2013, 2014, …, 9998, 9999
%H Hour (24-hour clock) 00, 01, …, 23
%I Hour (12-hour clock) 01, 02, …, 12
%M 补零后,以十进制数显示的分钟 00, 01, …, 59
%S 补零后,以十进制数显示的秒 00, 01, …, 59
%U Week number of the year (Sunday as the first day of the week) 00, 01, …, 53
%W Week number of the year (Monday as the first day of the week) 00, 01, …, 53
%c 本地化的适当日期和时间表示 Tue Aug 16 21:30:00 1988
%x 本地化的适当日期表示 08/16/1988
%X 本地化的适当时间表示 21:30:00
%% 字面的 ‘%’ 字符 字面的 ‘%’ 字符

格式可以用任意连接符组合成你想要的格式

import datetime
t = datetime.datetime.now()
print(t.strftime("%Y%m%d"),type(t.strftime("%Y%m%d")))
print(t.strftime("%Y-%m_%d:%H-%M:%S"))# output:
20220424 <class 'str'>
2022-04_24:11-16:36

注意,此时返回的就是字符串

datetime.timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0)

通过datetime.timedelta类创建一个时间差,用来进行计算

四、问题解决

通过datetime的使用可以看到,(end_time-start_time).microseconds获取的是毫秒这个维度的值,而非所有的值

import datetime
# 2022-04-24 10:51:23.677632
start_time = datetime.datetime(2022, 4, 24, 10, 51, 23, 677632)
# 2022-04-24 10:51:35.713161
end_time = datetime.datetime(2022, 4, 24, 10, 51, 35, 713161)print("days: ", (end_time-start_time).days)
print("seconds: ", (end_time-start_time).seconds)
print("microseconds: ", (end_time-start_time).microseconds)# output:
days:  0
seconds:  12
microseconds:  35529

如果想要获取秒级时间差,而且保留2位小数,可以

(end_time-start_time).seconds + round((end_time-start_time).microseconds/1000000, 2)

也可以使用total_seconds()方法

round((end_time-start_time).total_seconds(), 2)

问题解决

五、秒数间隔

datetime计算秒数间隔

import datetime
# 2022-04-24 10:51:23.677632
start_time = datetime.datetime(2022, 4, 24, 10, 51, 23, 677632)
# 2022-04-25 11:52:35.713161
end_time = datetime.datetime(2022, 4, 25, 11, 52, 35, 713161)print("seconds: ", (end_time-start_time).seconds)# output:
seconds:  3672

这两个时间相差1d+,但是输出的结果中仅为3672s
原因在于seconds只能计算同一天的间隔,所以事先要计算出差值的天数,用天数144060+秒数才能得到正确的结果
对于这种情况一般使用total_seconds()来解决

import datetime
# 2022-04-24 10:51:23.677632
start_time = datetime.datetime(2022, 4, 24, 10, 51, 23, 677632)
# 2022-04-25 11:52:35.713161
end_time = datetime.datetime(2022, 4, 25, 11, 52, 35, 713161)print((end_time-start_time).total_seconds())# output:
total_seconds:  90072.035529

【python】datetime模块计算时间差相关推荐

  1. python利用datetime模块计算时间差

    python中通过datetime模块可以很方便的计算两个时间的差,datetime的时间差单位可以是天.小时.秒,甚至是微秒,下面我们就来详细看下datetime的强大功能吧 今天写了点东西,要计算 ...

  2. python 时间差模块_python利用datetime模块计算时间差

    今天写了点东西,要计算时间差,我记得去年写过,于是今天再次mark一下,以免自己忘记 In [27]: from datetime import datetime In [28]: a=datetim ...

  3. Python datetime time计算时间差

    一.计算时间差 """ python主文件 """ # -*- coding: utf-8 -*-import time"&quo ...

  4. python时间计算_python利用datetime模块计算时间差、当前时间多加一天、一小时、一分钟和常用操作...

    记录下试用datetime的一些常用操作In [1]: from datetime import datetime In [2]: aa = datetime.now() In [3]: aa Out ...

  5. python 利用datetime 模块计算时间差、当前时间多加一天、一小时、一分钟等操作

    1. 常用操作 from datetime import datetimeaa = datetime.now()print(aa) # datetime.datetime(2021, 9, 24, 1 ...

  6. python datetime模块-Python datetime模块使用方法小结

    datetime模块 当前日期 datetime.date.today() datetime.date(2020, 4, 24) 转换元祖 >>> datetime.date.tim ...

  7. python ovito模块计算某一类原子的MSD均方位移

     此文章为用python ovito模块计算某一类原子的MSD ovito.modifiers.CalculateDisplacementsModifier 基于ovito.pipline.Refer ...

  8. python datetime模块

    一.datetime模块介绍 (一).datetime模块中包含如下类: 类名 功能说明 date 日期对象,常用的属性有year, month, day time 时间对象 datetime 日期时 ...

  9. linux datetime,Python datetime模块示例详解

    一.datetime模块介绍 (一).datetime模块中包含如下类: 类名功能说明 date 日期对象,常用的属性有year, month, day time 时间对象 datetime 日期时间 ...

最新文章

  1. 2019ug最新版本是多少_UGNX将在2019年发布最新版本,也是最后一个版本,让人更意想不到的是它的这项新功能!...
  2. 抖音开放平台 php-sdk 注意事项
  3. 最有影响力的自然语言处理NLP论文
  4. 跟前腾讯总监学Java实战项目
  5. 遮挡摄像头 判断_长治一学校门口树枝遮挡信号灯,危险!
  6. Ajax — 聊天机器人演示
  7. JAVA入门级教学之(算数运算符)
  8. php打印错误日志到本地,nginx+php怎么打印php的错误日志?
  9. PowerMock介绍
  10. Java 根据枚举的名字得到枚举的实例
  11. 滑动窗口1——无重复字符的最长字串
  12. Spring入门第十七课
  13. html中ip输入格式正则表达式,通过正则表达式验证IP和端口格式的正确性
  14. 关于flymcu烧录stm32芯片超时的问题解决
  15. 清华大学:模拟电子技术基础
  16. ios 手势返回监听方法
  17. 利用Matlab进行图像处理
  18. 蒸汽平台进dota2显示连接不上服务器,蒸汽平台dota2连不上服务器
  19. URP关于多个摄相机的性能优化
  20. Android | 教你如何开发一键银行卡绑定功能

热门文章

  1. 使用APICloud低代码开发平台开发物流仓储app
  2. 解决使用专有网络的阿里云服务器无法远程连接的问题
  3. 千万级车联网 MQTT 消息平台架构设计
  4. Global.asa文件使用详细介绍
  5. CAD图纸中CAD文字边界为锯齿形的原因及解决办法
  6. 视频教程-finereport从入门到实战视频教程-大数据
  7. 先进的驾驶系统(Advanced Driver Assistance Systems)即高级驾驶员辅助系统
  8. 用html编写一个红绿灯,利用js实现简易红绿灯
  9. Linux配置NFS文件共享存储
  10. ES使用聚合查询报错exception [type=search_phase_execution_exception, reason=all shards failed]