【python测试开发栈】帮你总结python time模块高频使用方法

在平时写python脚本时,时间是我们经常用到的数据,比如:时间戳、前端展示的对应格式的时间等,在python中主要有三个和时间处理相关的模块:timedatetimecalendar,这篇文章主要帮大家整理这三个模块比较常用的方法。

熟悉三个概念

GMT

格林威治时间, 十七世纪,格林威治皇家天文台为了海上霸权的扩张计画而进行天体观测, 观测所门口墙上有一个标志24小时的时钟,显示当下的时间,对全球而言,这里所设定的时间是世界时间参考点,全球都以格林威治的时间作为标准来设定时间 。但是由于地球在椭圆轨道中运行速度不均匀,GMT时间会有误差,因此现在已不再作为标准时间使用。

UTC

协调时间时,又称:世界标准时间,其计算方法更加精确。如果本地时间比UTC时间快,例如中国、蒙古国、新加坡、马来西亚、菲律宾、澳大利亚西部的时间比UTC快8小时,就会写作UTC+8,俗称东8区。相反,如果本地时间比UTC时间慢,例如夏威夷的时间比UTC时间慢10小时,就会写作UTC-10,俗称西10区。

DST(Daylight Saving Time)

夏令时间,在夏天,天亮的比较早,将时间全部调快一个小时,以达到提早使用日光的目的,从而削减灯光照明和耗电开支。中国也曾经实施过夏令时,但是因为不方便,于1992年暂停了夏令时,不过目前全世界还有几十个国家在使用夏令时。

time

我整理了time的方法,发现其实time模块整体是围绕着三种状态来运转的,如下图所示:

WX20200107-125720@2x.png

其中三种状态对应的数据格式如下:

  • 时间戳的格式是:1578373137.54444
  • 时间元祖的格式是:time.struct_time(tm_year=2020, tm_mon=1, tm_mday=7, tm_hour=4, tm_min=58, tm_sec=57, tm_wday=1, tm_yday=7, tm_isdst=0),它其实就是对时间数据格式的描述。
  • 格式化时间:2020-01-07 12:58:57 这个是根据我们传入的format格式来转换的。

常用方法

将时间戳转为时间元祖

# 获取时间戳
time_stamp = time.time()
print(time_stamp)
# 将时间戳转为时间元祖,从1970年1月1日 0点0分计算
print(time.gmtime(time_stamp))
# 将时间戳转为时间元祖 ,本地时间,如果在中国就是从1970年1月1日 8点0分计算
local_time_tuple = time.localtime(time_stamp)
print(local_time_tuple)

这里需要注意:time.gmtime()是从UTC时间开始计算的,而time.localtime()是从当地时间开始计算的,比如:在中国是从UTC+8小时开始计算的,这是这两个方法主要的区别。

将时间元祖转成时间戳

# 将时间元祖转成时间戳
time.mktime(local_time_tuple)

将时间元祖转成格式化时间

# 将时间元祖格式化,
local_time_str = time.strftime("%Y-%m-%d %H:%M:%S", local_time_tuple)
# 可以将时间元祖转换为简单格式的字符串
time.asctime(local_time_tuple)

帮大家整理了比较常用的格式,当然,这个不需要记忆,用的时候可以查文档,但是常用的格式还是需要掌握的:

格式 含义 注释
%Y 十进制数表示的带世纪的年份
%y 十进制数 [00,99] 表示的没有世纪的年份
%m 十进制数 [01,12] 表示的月
%d 十进制数 [01,31] 表示的月中日
%H 十进制数 [00,23] 表示的小时(24小时制)
%I 十进制数 [01,12] 表示的小时(12小时制)
%M 十进制数 [00,59] 表示的分钟
%S 十进制数 [00,61] 表示的秒
%W 十进制数 [00,53] 表示的一年中的周数(星期一作为一周的第一天)作为。在第一个星期一之前的新年中的所有日子被认为是在第0周。
%U 十进制数 [00,53] 表示的一年中的周数(星期日作为一周的第一天)作为。在第一个星期日之前的新年中的所有日子都被认为是在第0周
%w 十进制数 [0(星期日),6] 表示的周中日
%p 本地化的 AM 或 PM
%Z 时区名称(如果不存在时区,则不包含字符)

将时间格式转成时间元祖

# 将时间格式转换为时间元祖
time.strptime(local_time_str, "%Y-%m-%d %H:%M:%S")

cpu时间

  • time.perf_counter() 高精度的时间计时器,可以用来测量短时间的值,比如:方法的执行时间。
  • time.process_time() 返回当前进程的系统和用户CPU时间总和的值(以小数秒为单位)
  • time.sleep() 暂停执行调用线程达到给定的秒数。需要注意的是:参数可以是浮点类型,也就是说,时间可以精确到毫秒级。

datetime

相对于time模块,datetime模块更注重对时间和日期的运算,在其内部主要有六个class:

  • date:用于对日期进行处理,属性有:年、月、日。
  • time:用于对时间处理,属性是:时、分、秒、毫秒。
  • datetime:包含了date和time的信息,所以这里我们主要介绍datetime对应的方法和操作。
  • timedelta:主要用于对日期进行运算,可生成一个时间偏差。
  • tzinfo:用于对市区描述的抽象基类,一般我们用不到。
  • timezone:实现了tzinfo。

常用方法:

获取今天的时间

test_dt = datetime.datetime.today()
print(test_dt)
print(test_dt.time())
print(test_dt.date())
print(test_dt.ctime())
print(test_dt.weekday())
print(test_dt.year)
# 从时间戳加载时间
test_dt_stamp = datetime.datetime.fromtimestamp(time.time())
print(test_dt_stamp)
# 从格列高利历序号加载时间,其中公元 1 年 1 月 1 日的序号为 1,
# 每增加一天,对应的值就增加1,比如公元1年1月2日的序号是2。
test_dt_dinal = datetime.datetime.fromordinal(1)
print(test_dt_dinal)

其中需要注意:

  • weekday()方法返回当前时间是一周中的第几天。默认的星期一是第0天,星期日是第6天。
  • fromordinal()方法是采用格列高利法,在计算时间时,不要忘记考虑闰年的情况。

时间的比较

这个比较好理解,datetime中的对象是可以直接被比较的,不过大多数情况下,比如:

 # 由两个时间戳获取datetime时间,从而比较他们的大小 
 test_stmap1 = datetime.datetime.fromtimestamp(time.time() - 4000000)
 test_stmap2 = datetime.datetime.fromtimestamp(time.time())
 if test_stmap2 > test_stmap1:
     print("test_stmap2 is bigger")

时间的计算

这主要是用到了我们前面提到了类:timedelta,它可以表示一个时间差值,比如:几天、几小时、甚至几周。然后我们可以找个时间基准来进行时间计算。比如,下面的例子,计算了昨天、今天、明天的时间:

# 计算昨天、今天、明天的时间
test_today = datetime.datetime.today()
print("today:", test_today)
one_day = datetime.timedelta(days=1)
yesterday = test_today - one_day
tomorrow = test_today + one_day
print("yesterday:", yesterday)
print("tomorrow:", tomorrow)

初次之外,timedelta还支持浮点型数字的运算:

# 浮点型运算
one_day = datetime.timedelta(days=1, hours=1)
one_point_five_day = one_day * 1.5
print(one_point_five_day)

这里需要注意的是:timedelta可以有多个参数,比如datetime.timedelta(days=1, hours=1, seconds=20)。那么和1.5相乘,每个参数都会和1.5相乘,比如上面例子的运行结果是:1 day, 13:30:00。

Calendar

calendar类主要用于对日历的操作,我这里为大家整理了它比较常用的方法,掌握这些方法,够你在工作中使用了。

常用方法

打印日历

 # 打印一年的日历
 calen = calendar.calendar(2020)
 print(calen)

 # 打印一个月的日历
 calen = calendar.month(2020,1)
 print(calen)

 # 打印的结果如下:
      January 2020
Mo Tu We Th Fr Sa Su
       1  2  3  4  5
 6  7  8  9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31

看着是不是挺炫的,仅用一行代码就能打印日历。

时间和月份

# 获取指定的年月日是星期几。
calendar.weekday(2020, 1, 7)
# 根据指定日期获取时间信息,返回两个值,第一个值表示1号是星期几,第二个值是这个月有多少天
calendar.monthrange(2019, 1)

闰年计算

 # 检测某一年是否是闰年
 calendar.isleap(2019)

 # 检测指定年限内闰年的数量
 calendar.leapdays(2008, 2020)

总结

python的时间处理模块,可以方便的帮你对时间进行处理,文中列出来比较高频使用的方法,当然大家如果感兴趣,完全可以去官方文档上翻看其他的方法(从前一段时间开始,python提供了中文的文档)。

关注【公众号:软件测试布道师】,回复【python】,即可获取【python自动化及编程实践资料】
Image placeholder
Fr00tL00ps511
未设置
  91人点赞

没有讨论,发表一下自己的看法吧

推荐文章
【python测试开发栈】帮你总结python random模块高频使用方法

随机数据在平时写python脚本时会经常被用到,比如随机生成0和1来控制逻辑、或者从列表中随机选择一个元素(其实抽奖程序也类似,就是从公司所有人中随机选择中奖用户)等等。这篇文章,就帮大家整理在pyt

详解layui模块化与非模块化的不同引用方式

layui模块化与非模块化的不同引用方式:1、模块化与非模块化的区别layui中有许多不同的内置模块,如弹出层、日期与时间选择器、分页等不同模块。模块化:使用时加载相应的模块。非模块化:一次性加载所有

面向回家编程!GitHub标星两万的”Python抢票教程”,我们先帮你跑了一遍

盼望着,盼望着,春节的脚步近了,然而,每年到这个时候,最难的,莫过于一张回家的火车票。据悉,今年春运期间,全国铁路发送旅客人次同比将增长8.0%。达到4.4亿人次,2020年铁路春运自1月10日开始,

面试高频:如何访问 Redis 中的海量数据?

目录前言事故产生分析原因解决方案总结前言有时候我们需要知道线上的redis的使用情况,尤其需要知道一些前缀的key值,那我们怎么去查看呢事故产生因为我们的用户token缓存是采用了【user_toke

MySQL Batched Key Access (BKA)原理和设置使用方法举例

MySQL5.6版本开始增加了提高表join性能的算法:BatchedKeyAccess(BKA)的新特性。BKA算法原理:将外层循环的行/结果集存入joinbuffer,内存循环的每一行数据与整个b

流畅的Python读书笔记 --- 第一章 Python数据模型

近期开始读“流畅的Python”这本书,想把自己的读书笔记分享给大家,希望能帮到也对这本书感兴趣但是没时间看的各位。(文章中大部分的话和图片摘录总结自“流畅的Python”一书,以及python官方网

Python程序员进阶必备:从新手到高手的100个模块

在知乎和CSDN的圈子里,经常看到、听到一些python初学者说,学完基础语法后,不知道该学什么,学了也不知道怎么用,一脸的茫然。近日,CSDN的公众号推送了一篇博客,题目叫做《迷思:Python学到

对话OceanBase资深总监韩鸿源:数据库是技术能力,云是使用方式,两者不应是竞争关系

5月10日,在第十届中国数据库技术大会(DTCC2019)上,蚂蚁金服的金融级分布式关系数据库OceanBase2.0,在经过200名数据库领域三年以上的从业者投票和专业评委的评选下,高分荣获了“年度

【THE LAST TIME】深入浅出 JavaScript 模块化

前言Thelasttime,Ihavelearned【THELASTTIME】一直是我想写的一个系列,旨在厚积薄发,重温前端。也是对自己的查缺补漏和技术分享。欢迎大家多多评论指点吐槽。系列文章均首发于

Testin用iTestin开启下一代测试,测试行业为什么要“重新来过”?

测试,其实并不是一个新话题。从有软件开发开始,就有测试,最早的测试就是找Bug。后来,自动化测试、云测试、众包测试的模式开始成为流行趋势,今天又迎来以智能化为核心的下一代测试。但是,“测试”从简单的软

为什么说 Python 是人工智能最佳Web开发的语言?

由于所有用户都可以使用大量的预构建库,因此Python非常适合人工智能在Web开发中的应用–但是还有什么能让它变得如此吸引人?在AbsoluteDigitalMedia,我们将仔细研究Python的历

Python面试|一文让你读懂if __name__==’__main__’的含义

程序入口对于很多编程语言来说,程序都必须要有一个入口,比如C,C++,以及完全面向对象的编程语言Java,C#等。如果你接触过这些语言,对于程序入口这个概念应该很好理解,C和C++都需要有一个main

python使用jieba实现中文文档分词和去停用词

分词工具的选择:  现在对于中文分词,分词工具有很多种,比如说: jieba分词、thulac、SnowNLP等。在这篇文档中,笔者使用的jieba分词,并且基于python3环境,选择jieba分词

超8千Star,火遍Github的Python反直觉案例集!

大数据文摘授权转载作者:SatwikKansal译者:暮晨Python,是一个设计优美的解释型高级语言,它提供了很多能让程序员感到舒适的功能特性。但有的时候,Python的一些输出结果对于初学者来说似

使用Jupyter NoteBook进行IB查询和交易,以及使用算法交易示例

在搞好IB盈透接口后,试了下客户端交易,但是最终目的还是使用程序化交易。发现vnpy已经提供的Script_engine来支持JupyterNoteBook交易的,而且非常方便调用。 这里就用写了基于

56岁潘石屹下决心学Python,60岁程序语言之父们还在敲代码,你呢

比你成功的人,比你还努力。上周,SOHO中国董事长、地产大亨 潘石屹,56岁生日当天发布微博宣布进军编程语言Python。 紧接着第二天,又更新微博解释为何会做出此举。潘石屹给出的解释大致就是,在不断

2019 最新计算机技能排名出炉:Python 排第三,第一名是…

除了编程语言之外,要想找一份计算机相关的工作,还需要很多其他方面的技能。最近,来自美国求职公司Indeed的一份报告显示:在全美工作技能需求中,数据库语言SQL、编程语言Java分列前两位。虽然Pyt

4分钟看尽Top编程语言15年沉浮:C#默Java泪,Python终上位!

大数据文摘出品作者:宁静哪种编程语言最火爆?在不同的时代,这个问题也有着不同的答案,而一部编程语言的使用人数变迁史,实际上也是一部计算机世界的成长编年史。一位名叫PYPL的油管up主很尽心地统计了从2

Python分析42年高考数据,告诉你高考为什么这么难?

大数据文摘授权转载自数据森麟作者:徐麟对于已经工作的“上班族”来说,6月7号到9号三天无疑是兴奋到飞起的,终于迎来了令人愉悦的端午假期。然而有那么一群人,将在端午节日之际迎来人生特别重要的一次经历或者

推荐:10个Python图像处理工具

概述了一些常用的Python库,它们提供了一种简单直观的图像转换方法。介绍在我们今天的世界中有很多的数据,而图像是这些数据中的重要组成部分。但是,要使用这些图像,需要对它们进行处理。因此,图像处理是分

大神程序员,夜夜coding到天明?Python之父昼伏夜出,PHP创始人24小时都在线

栗子鱼羊 发自凹非寺转自量子位 |公众号QbitAI大神程序员,夜夜coding到天明?有位名叫IvanBessarabov(简称“伊万”)的好事者,刚刚统计了各路大佬的代码提交(gitcommit)

用 Python 给女友做了个可能会被打死的七夕礼物

马上就是七夕了,晓得你们有女票的或者正在追妹子的,肯定又在绞尽脑汁想买什么别出新裁的礼物,如果女生感觉你的礼物花心思了,那肯定是好感度倍增啊。今天给各位分享一个用Python制作的成本一毛钱却诚意满满

PHP跌出前十,铁打的 Python 连续3年第一:IEEE Spectrum 2019编程语言排行榜出炉

Python势头不减,依旧第一,而且进一步拉开了与其他语言的差距。这一结果,来自IEEESpectrum2019年度编程语言排行榜。这已经是Python连续3年保持第一。在Python之下,第二交椅的

最受欢迎的编程语言排行:Python与Java谁更受欢迎?

Python在全球开发人员中的受欢迎程度急剧上升,专注于研究开发人员的SlashData最近公布了实际使用该语言的开发人员数量。根据SlashData的数据,目前世界上有820万使用Python编写代

史上第一张黑洞照片是用Python合成的?

这两天,史上第一张黑洞照片,在朋友圈和各大公众号疯传,希望你没有收到视觉中国的律师函。好了,言归正传。这个照片是怎么「拍到」的呢?其中一位研究人员(一个妹子,MIT 的博士,就是头图这位)就在 TED