听说你不会用datetime处理时间?

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

  • 它是要 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格式符,请笑纳。

在这里插入图片描述

下面是配套资料,对于做【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!
在这里插入图片描述

最后: 可以在公众号:伤心的辣条 ! 免费领取一份216页软件测试工程师面试宝典文档资料。以及相对应的视频学习教程免费分享!,其中包括了有基础知识、Linux必备、Shell、互联网程序原理、Mysql数据库、抓包工具专题、接口测试工具、测试进阶-Python编程、Web自动化测试、APP自动化测试、接口自动化测试、测试高级持续集成、测试架构开发测试框架、性能测试、安全测试等。

学习不要孤军奋战,最好是能抱团取暖,相互成就一起成长,群众效应的效果是非常强大的,大家一起学习,一起打卡,会更有学习动力,也更能坚持下去。你可以加入我们的测试技术交流扣扣群:914172719(里面有各种软件测试资源和技术讨论)

喜欢软件测试的小伙伴们,如果我的博客对你有帮助、如果你喜欢我的博客内容,请 “点赞” “评论” “收藏” 一键三连哦!


好文推荐

转行面试,跳槽面试,软件测试人员都必须知道的这几种面试技巧!

面试经:一线城市搬砖!又面软件测试岗,5000就知足了…

面试官:工作三年,还来面初级测试?恐怕你的软件测试工程师的头衔要加双引号…

什么样的人适合从事软件测试工作?

那个准点下班的人,比我先升职了…

测试岗反复跳槽,跳着跳着就跳没了…

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值