51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 2014|回复: 1
打印 上一主题 下一主题

[资料] 听说你不会用 datetime 处理时间?

[复制链接]
  • TA的每日心情
    无聊
    昨天 09:05
  • 签到天数: 1050 天

    连续签到: 1 天

    [LV.10]测试总司令

    跳转到指定楼层
    1#
    发表于 2021-11-9 14:53:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    在日常工作中基本每天都会与时间类型打交道,比如[url=]数据库[/url]每条数据的创建时间,更新的时候需要写入的更新时间,那么问题来了,如下:
      它是要 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 格式符,请笑纳。








    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有帐号?(注-册)加入51Testing

    x
    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏1
    回复

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-11-22 21:31 , Processed in 0.069454 second(s), 23 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表