• 0
  • 0
分享
  • 听说你不会用 datetime 处理时间?——软件测试圈
  • 曼倩诙谐 2021-11-12 09:51:19 字数 3489 阅读 798 收藏 0

  在日常工作中基本每天都会与时间类型打交道,比如数据库每条数据的创建时间,更新的时候需要写入的更新时间,那么问题来了,如下:

  它是要 UTC Time(世界统一时间)还是要本地时间?

  日期的格式要怎么格式化?

  我如果得到的是一个时间戳,我该怎么转成目标时间?

  我如果想把数据库的时间转成时间戳我改怎么处理?

  等等等等

  上面说的这些,不复杂,但是你不能不知道,如果连这类的基础在用到的时候都需要去检索,那么就不用谈效率了。

  下面,咱们通过几个实例,一起来看一下使用 datetime 这个库做日期和时间的管理和转换。

  实例 1:获取当前时间

import time
from datetime import datetime
now = datetime.now()
print(f'当前时间: {now}')
print(f'当前时间拆分: {now.year, now.month, now.day}')
strf_now = datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')
print(f'格式化当前时间: {strf_now}')
strf_now_1 = datetime.strftime(datetime.now(), '%Y-%m-%d %H:%M:%S')
print(f'格式化当前时间-1: {strf_now_1}')
<OUTPUT>

  当前时间: datetime.datetime(2020, 12, 13, 16, 5, 57, 448449)

  当前时间拆分: (2020, 12, 13)

  格式化当前时间: '2020-12-13 16:05:57.448602'

  格式化当前时间-1: '2020-12-13 16:05:57'

  对上述代码进行解释:

  now 中的 datetime.now() 用来获取当前的时间,返回的数据为 datetime 类型;.year .mongo .day 分别用来获取年、月、日;

  strf_now 中 strftime 用来格式化 datetime 类型的数据;格式化之后,返回的是 str 类型的数据;

  strf_now_1 中演示了使用 strftime 格式化的另一种方法,返回的结果和数据类型与 strf_now 一样,这里用伪代码写一下上面说的两种方法

  {datetime 类型对象}.strftime( {格式符组} )

  datetime.strftime( {datetime 类型对象}, {格式符组} )

  strftime 的格式符已经在文末整理好了,可以保存下来,用到的时候方便查阅。

  实例 2:获取当前的UTC时间

from datetime import timedelta
utc_now = datetime.utcnow()
print(f'UTC 当前时间: {utc_now}')
utc2local = utc_now + timedelta(hours=8)
print(f'当地当前时间: {utc2local}')
<OUTPUT>

  UTC 当前时间: datetime.datetime(2021, 9, 8, 12, 13, 31, 472850)

  当地当前时间: datetime.datetime(2021, 9, 8, 20, 13, 31, 472850)

  对上述代码进行解释:

  datetime.utcnow() 用来获取 UTC (全球统一)时间,返回的数据类型为 datetime 类型;

  utc2local 完成的是 UTC 时间转当前时间的过程(科普:UTC 时间转当前实际上做的只是在原有时间基础上加 8 小时);

  其中的 timedelta 会在“实例 3”中讲解,它的作用是可以在当前时间的基础上增加或者减少一定的时间。

  实例 3:获取一个时间之前或者之后一段时间后的时间,使用timedelta可以很方便的实现

from datetime import timedelta
delta_now = datetime.now() + timedelta(days=1)
print(f'delta_now: {delta_now}')
<OUTPUT>
delta_now: datetime.datetime(2021, 9, 8, 20, 54, 45, 479097)

  对上述代码进行解释:

  首先需要注意,与 timedelta 相加的,须为 datetime 类型;

  timedelta(days=1) 返回 datetime 类型,相加后,也返回 datetime 类型;

  delta_now 表示在现在的基础上,加上一天返回;

  timedelta 还支持很多参数,如下,如果多个传入,请注意顺序datetime.timedelta(days=0,seconds=0,microseconds=0,milliseconds=0,minutes=0,hours=0,weeks=0)

  timedelta 的值支持负数,例如 days=-1,表示减掉一天。

  实例 4:字符串时间转时间戳

import time
def time2stamp(t):
    time_array = time.strptime(t, '%Y-%m-%d %H:%M:%S')
    print(type(time_array), '->', time_array)
    timestamp = time.mktime(time_array)
    return timestamp
if __name__ == '__main__':
    print('->', time2stamp('2020-12-10 23:34:30'))
<OUTPUT>
<class 'time.struct_time'> -> time.struct_time(tm_year=2020, tm_mon=12, tm_mday=10, tm_hour=23, tm_min=34, tm_sec=30, tm_wday=3, tm_yday=345, tm_isdst=-1)
-> 1607614470.0

  对上述代码进行解释:

  time.strptime() 函数根据指定的格式把一个时间字符串解析为时间元组,供后续使用;

  time.mktime() 接收结构化之后的时间对象作为参数(上面的 time.strptime() 的返回值),返回用秒数来表示时间的浮点数;

  实例 5:当前时间转时间戳

import time
form datetime import datetime
def get_now_stamp():
    now_time = datetime.now()
    return time.mktime(now_time.timetuple())
if __name__ == '__main__':
    print('->', get_now_stamp())
<OUTPUT>
-> 1607848078.0

  实例 5 不多说,实例 4 搞明白了,理解实例 5 自然不成问题。

  实例 6:时间戳转时间

from datetime import datetime
def stamp2time(timestamp):
    return datetime.fromtimestamp(timestamp)
if __name__ == '__main__':
    print('->', stamp2time(1607614470))
<OUTPUT>
-> datetime.datetime(2020, 12, 10, 23, 34, 30)

  对上述代码解释:

  datetime.fromtimestamp() 时间戳(int 型)转换为 datetime 类型时间;

  以上的方法,建议大家根据自己的需要,封装成工具类,其中实例 4、5、6 是封装好的现成的方法,可以直接使用;这样在使用的时候可以很方便的调用;

  当然工具类可以往里面补充很多常用函数,有了这个利器,你开发的效率也会逐渐的快起来。

  下面是 strftime 格式符,请笑纳。

1-1.png



作者:Ethan   

来源:http://www.51testing.com/html/52/n-4479852.html


2021 问卷礼物图.png

  • 【留下美好印记】
    赞赏支持
登录 后发表评论
+ 关注

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          •   1、前言  大家好!我是Meng  前段时间,很荣幸被一合作伙伴邀请发表一篇文章,主题为"这些年,我所从事软件测试的一些感悟",正好趁着这个机会,我也好好总结一下。  2、测试培训  对于软件测试,在培训之前也不知道是干什么的,只知道有软件开发,之后才知道有软件测试这个行业。  刚开始也是在徘徊是做开发还是做测试,经过多次被测试机构的招生老师洗脑后,开始进行了软件测试培训之旅。那时候测试培训机构就那么几家,基本都是机构,个人的很少,培训机构是线下的,线上的也很少。培训价格方面也是过万了,跟现在的培训机构差不多,也就便宜了几千而已。  回头一想想,那时候教的内容,真的很少...
            0 0 1337
            分享
          •   中国信通院官方公众号宣布,中国信息通信研究院(简称“中国信通院”)完成了对华为技术有限公司鸿蒙内核的自主成熟度等级认证工作,自主研发比率为 100%,自主成熟度等级为 A 级,并在华为开发者大会 HDC 2024 上向其颁发了证书。  中国信通院表示,操作系统内核自主可控的意义在于保障国家信息安全能力,提升技术创新实力,增强在国际上的竞争力,从而形成良好的自主研发的产业生态。“该认证不仅体现了华为鸿蒙内核自主成熟度达到了高水平,也标志着我国在操作系统内核领域的自主成熟度迈上了新台阶。”  6 月 28 日,中国信通院宣布已完成对 HarmonyOS NEXT 移动智能终端操作系统隐私保护能...
            0 0 330
            分享
          • 1.什么是小程序英文名 Mini Program 是一种不需要下载安装即可使用的应用,是内嵌在微信 APP 里面的一款新形态软件。它实现了应用“触手可及”的梦想,用户扫一扫或者搜一下即可打开应用。也体现了“用完即走”的理念,用户不用关心是否安装太多应用的问题。应用将无处不在,随时可用,但又无需安装卸载。小程序的架构:包含View视图层、AppService 逻辑层。View 层用来渲染页面结构,AppService 层用来逻辑处理、数据请求、接口调用,它们在两个线程里运行。视图层使用 WebView 渲染...
            0 0 5667
            分享
          • 测试用例阶段场景用例覆盖--增加开发对需求的全局理解深度已确认优化需求重点提醒--确保开发和测试对需求的信息同步提供开发自测用例--增加开发自测的认知在测试用例评审阶段,也就是程序开发阶段,用例覆盖率尽可能的全面,能进一步提高开发设计方法或对业务逻辑的理解,减少不必要的缺陷产生。测试阶段测试整体至少分为三轮:测试环境:核心测试,包括ui细节、字段规则、逻辑 校验等。(时间占比:60%)预生产环境:二次进行全流程场景测试(时间占比:30%)上线tag验证:确保代码合并到master后没有问题(时间占比:10%)代码扫描/错误监测:sonar声呐代码扫描工具,检测开发代码一些常规的语法规则错误;b...
            0 0 1456
            分享
          •   你是不是还在为描述缺陷复现步骤而苦恼?你是不是还在为寻找一款合适的视屏录制软件而挣扎?那么,你应该好好看看这篇小文章。  作为测试人员,撰写测试用例、提交测试缺陷是基本工作。但往往我们会遇到:开发人员无法根据我们描述的缺陷步骤,复现缺陷现象。且不说是不是因为测试人员描述的步骤不够精准或不够详细,一旦出现开发无法复现缺陷现象时就会出现频繁地沟通,导致出现缺陷处理时间延长的潜在风险。不仅如此,即使是测试人员一对一、当面为开发人员演示了缺陷的复现步骤,也可能出现缺陷处理人的转移而重复缺陷复现过程,由此会出现许多反复无效的沟通环节。  那么,你是怎么复现缺陷步骤呢?可能大家都有比较好的方法。但是笔...
            0 0 1011
            分享
      • 51testing软件测试圈微信