time模块

在平常的代码中,我们常常需要与时间打交道。在Python中,与时间处理有关的模块就包括:time,datetime,calendar(很少用,不讲),下面分别来介绍。

我们写程序时对时间的处理可以归为以下3种:时间的显示,在屏幕显示、记录日志等"2022-03-04"

时间的转换,比如把字符串格式的日期转成Python中的日期类型时间的运算,计算两个日期间的差值等

在Python中,通常有这几种方式来表示时间:

  1. 时间戳(timestamp), 表示的是从1970年1月1日00:00:00开始按秒计算的偏移量。例子:1554864776.161901
  2. 格式化的时间字符串,比如“2020-10-03 17:54”
  3. 元组(struct_time)共九个元素。由于Python的time模块实现主要调用C库,所以各个平台可能有所不同,
  4. mac上:time.struct_time(tm_year=2020, tm_mon=4, tm_mday=10, tm_hour=2,tm_min=53, tm_sec=15, tm_wday=2, tm_yday=100, tm_isdst=0)
索引(Index) 属性(Attribute)         值(Values)
0 tm_year(年) 2011
1 tm_mon(月) 1 - 12
2 tm_mday(日) 1 - 31
3 tm_hour(时) 0 - 23
4 tm_min(分) 0 - 59
5 tm_sec(秒) 0 - 61
6 tm_wday(weekday) 0 - 6(0表示周一)
7 tm_yday(一年中的第几天) 1 - 366
8 tm_isdst(是否是夏令时) 默认为-1

UTC时间

UTC(Coordinated Universal Time,世界协调时)亦即格林威治天文时间,世界标准时间。在中国为UTC+8,又称东8区。DST(Daylight Saving Time)即夏令时。

time模块的常用方法

time.sleep(secs) :线程推迟指定的时间运行,单位为秒。

import time
# time.sleep(secs) 可以暂停一段时间(秒)
print("你好啊")
time.sleep(3) #程序等待3秒
print("你也好啊")

可以控制程序执行的频率

while True:
print("爬虫程序正在抓取百度信息")
time.sleep(3)

甚至可以用随机数进行替换

import time
import random # 生成一个1-5秒的随机延迟
delay = random.uniform(1, 5) # 暂停相应的随机时间
time.sleep(delay)

time.time() :获取当前时间的时间戳。(数字类型的时间)

time.time() 它返回当前时间的时间戳。时间戳是自1970年1月1日00:00:00(UTC)以来的秒数,不包括闰秒。

这个函数通常用于获取代码运行时的时间,可以用于性能测试、时间戳日志等。返回的时间戳是一个浮点数,表示秒数,同时也可以表示毫秒、微秒等。

下面是一个简单的例子:

import time
print(time.time()) #运行结果 2023-12-05 17:36:44.449821
1701769004.449821

1701769004.449821 这个数字是一个十进制数,表示的是从1970年1月1日00:00:00 UTC到现在的秒数,以及微秒数。其中,小数点后面的部分(449821)表示的是微秒数

使用time计算时间差运算(单位秒)

import time
start = time.time()
for i in range(1000):
a=i
end = time.time()
print(end-start) #计算循环运算耗费了多少时间 994
995
996
997
998
999
0.006974002838134766

Datetime模块

相比于time模块,datetime模块的接口则更直观、更容易调用

datetime模块定义了下面这几个类:

  • datetime.date:表示日期的类。常用的属性有year, month, day;
  • datetime.time:表示时间的类。常用的属性有hour, minute, second, microsecond;
  • datetime.datetime:表示日期时间。
  • datetime.timedelta:表示时间间隔,即两个时间点之间的长度。
  • datetime.tzinfo:与时区有关的相关信息。(这里不详细充分讨论该类,感兴趣的童鞋可以参考python手册)

我们需要记住的方法仅以下几个:

1.获取当前的datetime时间和日期

datetime.datetime.now()

可以配合调用.timestamp().today().year.timetuple().time()等方法

import datetime

print(datetime.datetime.now())       # 打印当前日期
print(datetime.datetime(2013, 12, 5, 17, 58, 43)) # 打印指定日期2013-11-05 17:58:43
print(datetime.datetime.now().timestamp()) # 打印时间戳
print(datetime.datetime.now().today()) # 打印现在时间
print(datetime.datetime.now().year) # 打印现在年
print(datetime.datetime.now().timetuple()) # 转化为time.struct_time()的9个元素的时间元组
print(datetime.datetime.now().time()) # 只显示现在时间,没有日期 #运行结果
2023-12-05 17:58:54.203664
2013-11-05 17:58:43
1701770334.203664
2023-12-05 17:58:54.203664
2023
time.struct_time(tm_year=2023, tm_mon=12, tm_mday=5, tm_hour=17, tm_min=58, tm_sec=54, tm_wday=1, tm_yday=339, tm_isdst=-1)
17:58:54.203664

datetime.date

print(datetime.date.today())    # 只显示今天日期,没有时间
print(datetime.date(1990-12-12)) # 指定一个时间 #运行结果
2023-12-05
1990-12-12

2.把一个时间戳转为datetime日期类型datetime.date.fromtimestamp(1701770334.203664)

import datetime
print(datetime.datetime.fromtimestamp(1701770334.203664))
print(datetime.date.fromtimestamp(1701770334.203664)) #运行结果
2023-12-05 17:58:54.203664
2023-12-05

3. 时间运算datetime.timedelta() 

print(datetime.datetime.now())
print(datetime.datetime.now() + datetime.timedelta(-4)) # 默认参数是天,当前时间 -4天
print(datetime.datetime.now() + datetime.timedelta(days=5, hours=3, minutes=30)) # 详细设置参数,当前时间+5天,3小时,30分钟 #运行结果
2023-12-09 17:37:11.701322
2023-12-05 17:37:11.701322 #当前时间 -4天
2023-12-14 21:07:11.701322 #当前时间 +5天,3小时,30分

单位换算.total_seconds()

import datetime
t1 = datetime.datetime(2018, 1, 2, 12, 30, 0)
t2 = datetime.datetime.today()
diff = t2 - t1
print(diff)
print(diff.total_seconds()) #换算成秒
#运行结果
2167 days, 4:34:55.250549
187245295.250549

4. 时间替换.replace()

print(datetime.datetime.now().replace(year=2999,month=11,day=30))
2999-11-30 15:12:17.046692

5.格式化一个时间.strftime()

strftime => str + f(format) + time   字符串+格式化+时间

使用标准的系统时间,默认的格式是:2023-12-09 17:59:45.835316

t = datetime.datetime.now()
print(t) #运行结果
2023-12-09 17:59:45.835316

python中时间日期格式化符号:

%y 两位数的年份表示(00-99)
%Y 四位数的年份表示(000-9999)
%m 月份(01-12)
%d 月内中的一天(0-31)
%H 24小时制小时数(0-23)
%I 12小时制小时数(01-12)
%M 分钟数(00-59)
%S 秒(00-59)
%a 本地简化星期名称
%A 本地完整星期名称
%b 本地简化的月份名称
%B 本地完整的月份名称
%c 本地相应的日期表示和时间表示
%j 年内的一天(001-366)
%p 本地A.M.或P.M.的等价符
%U 一年中的星期数(00-53)星期天为星期的开始
%w 星期(0-6),星期天为星期的开始
%W 一年中的星期数(00-53)星期一为星期的开始
%x 本地相应的日期表示
%X 本地相应的时间表示
%Z 当前时区的名称
%% %号本身

利用表中的对应关系,我们把标准的时间(2023-12-09 17:59:45.835316)改造成我们需要的时间格式(2023年12月09日 17小时59分钟45秒)

t = datetime.datetime.now()
print(t)
print(t.strftime("%Y年%m月%d日 %H小时%M分钟%S秒")) #运行结果
2023-12-09 17:59:45.835316
2023年12月09日 17小时59分钟45秒

6.计算时间差

手动输入时间,把字符串以特定格式转换成时间.strptime => str + p(parse) + time   字符串+转化+时间

import datetime
s1 = input("请输入第一个时间(yyyy-mm-dd HH:MM:SS):")
s2 = input("请输入第二个时间(yyyy-mm-dd HH:MM:SS):") # 把字符串转化成时间
t1 = datetime.datetime.strptime(s1, "%Y-%m-%d %H:%M:%S")
t2 = datetime.datetime.strptime(s2, "%Y-%m-%d %H:%M:%S")
print(t2 - t1) #运行结果
请输入第一个时间(yyyy-mm-dd HH:MM:SS):2022-12-1 1:1:1
请输入第二个时间(yyyy-mm-dd HH:MM:SS):2023-12-1 2:2:1
365 days, 1:01:00

这里需要感受一下,形参和实参的对应关系。

总结:

time必要掌握的内容

time.sleep(secs)    #让程序休眠多少秒
time.time() #获取当时的时间戳

datetime必要掌握的内容

datetime.datetime.now()    #系统时间
datetime.datetime(2013, 12, 5, 17, 58, 30) #自定义指定一个时间
.strftime("%Y年%m月%d日 %H小时%M分钟%S秒")) #格式化一个时间
.strptime(str, "%Y-%m-%d %H:%M:%S") #把字符串转化为时间
date.today() #获取今天的时间

time模块扩展阅读:

由于time模块复杂以及难以调用,time后面大多的功能都被datetime模块替代,仅提供大家了解


time.localtime([secs]):将一个时间戳转换为当前时区的struct_time。如果 secs 参数省略,则默认使用当前时间。它返回的是一个时间元组(time.struct_time),包含年、月、日、小时、分钟、秒等信息。

import time
print(time.localtime()) #运行结果
time.struct_time(tm_year=2023, tm_mon=12, tm_mday=5, tm_hour=17, tm_min=33, tm_sec=6, tm_wday=1, tm_yday=339, tm_isdst=0)

time.gmtime([secs]):和time.localtime()方法类似,time.gmtime([secs])函数将给定的时间戳转换为UTC时间(即协调世界时)。如果 secs 参数省略,则默认使用当前时间。它返回的是一个时间元组(time.struct_time),包含年、月、日、小时、分钟、秒等信息。

import time
print(time.gmtime()) #运行结果
time.struct_time(tm_year=2023, tm_mon=12, tm_mday=5, tm_hour=9, tm_min=35, tm_sec=55, tm_wday=1, tm_yday=339, tm_isdst=0)

time.mktime(t) :将一个struct_time转化为时间戳。time.mktime() 函数接受一个时间元组作为参数,但时间元组的各个字段应该是按照顺序排列的,而不能使用关键字参数。

import time
print(time.mktime(time.localtime())) #把当前时间,以时间戳的方式输出
print(time.mktime((2023, 12, 5, 11, 1, 8, 5, 343, 0))) #把指定时间,以时间戳的方式输出 #运行结果
1701768786.0
1701745268.0

在这个例子中,我按照 (tm_year=2023, tm_mon=12, tm_mday=5, tm_hour=11, tm_min=1, tm_sec=55, tm_wday=1, tm_yday=339, tm_isdst=0) 的顺序提供了时间元组的各个字段。请注意,tm_wday(星期几)和 tm_yday(一年中的第几天)这两个字段是自动计算的,所以你无需手动提供它们的值。


time.strftime(format[, t]) :把一个代表时间的元组或者struct_time“如由time.localtime()和time.gmtime()返回”转化为格式化的时间字符串。如果t未指定,将传入time.localtime()。

import time
print(time.strftime("%Y-%m-%d %X", time.localtime())) #运行结果
2023-12-05 17:45:31

time.strptime(string[, format]) :把一个格式化时间字符串转化为struct_time。实际上它和strftime()是逆操作。

import time
time.strptime("2023-12-5 17:54","%Y-%m-%d %H:%M") #运行结果
time.struct_time(tm_year=2023, tm_mon=12, tm_mday=5, tm_hour=17, tm_min=54, tm_sec=0, tm_wday=1, tm_yday=339, tm_isdst=-1)

time时间戳和时间关系转换图

字符串转时间格式对应表非常复杂,十分不好记录,因此time模块基本上被datetime取代了

Python——第五章:time模块、datetime模块的更多相关文章

  1. Python第五章__模块介绍,常用内置模块

    Python第五章__模块介绍,常用内置模块 欢迎加入Linux_Python学习群  群号:478616847 目录: 模块与导入介绍 包的介绍 time &datetime模块 rando ...

  2. 简学Python第五章__模块介绍,常用内置模块

    Python第五章__模块介绍,常用内置模块 欢迎加入Linux_Python学习群  群号:478616847 目录: 模块与导入介绍 包的介绍 time &datetime模块 rando ...

  3. Python第十一章-常用的核心模块04-datetime模块

    python 自称 "Batteries included"(自带电池, 自备干粮?), 就是因为他提供了很多内置的模块, 使用这些模块无需安装和配置即可使用. 本章主要介绍 py ...

  4. Python模块01/自定义模块/time模块/datetime模块/random模块

    Python模块01/自定义模块/time模块/datetime模块/random模块 内容大纲 1.自定义模块 2.time模块 3.datetime模块 4.random模块 1.自定义模块 1. ...

  5. Python开发【第五章】:常用模块

    一.模块介绍: 1.模块定义 用来从逻辑上组织python代码(变量,函数,类,逻辑:实现一个功能),本质上就是.py结尾python文件 分类:内置模块.开源模块.自定义模块 2.导入模块 本质:导 ...

  6. python五十四课——datetime模块

    3.datetime模块:理解:datetime可以认为是time模块的补充/扩展datetime模块中有一些常用类:datetime类:记录了日期和时间数据信息date类:记录了日期数据信息time ...

  7. Python全栈之路----常用模块----datetime模块详解

    相比于time模块,datetime模块的接口则更直观,更容易调用. datetime模块定义了下面这几个类: datetime.date:表示日期的类,常用的属性有year,month,day: d ...

  8. Python第十一章-常用的核心模块01-collections模块

    python 自称 "Batteries included"(自带电池, 自备干粮?), 就是因为他提供了很多内置的模块, 使用这些模块无需安装和配置即可使用. 本章主要介绍 py ...

  9. Python第十一章-常用的核心模块03-json模块

    python 自称 "Batteries included"(自带电池, 自备干粮?), 就是因为他提供了很多内置的模块, 使用这些模块无需安装和配置即可使用. 本章主要介绍 py ...

  10. python模块 | 时间处理模块—datetime模块

    在python中,与时间处理相关的模块有 time,datetime,calendar. 时间的两个概念: UTC(世界协调时): 整个地球分为二十四时区,每个时区都有自己的本地时间.格林威治天文时间 ...

随机推荐

  1. tree-test

    #include <iostream> #include <stack> using namespace std; typedef struct BiTNode{ char d ...

  2. JavaScript中的浅拷贝与深拷贝

    前言 JavaScript中的浅拷贝和深拷贝是非常重要的概念,它们在处理对象和数组时具有不同的作用.在编程中,经常需要复制数据以便进行各种操作,但必须注意拷贝的方式,以确保得到预期的结果. 浅拷贝是创 ...

  3. 浅谈关于LCA

    prologue 本身只会 tarjan 和 倍增法求LCA 的,但在发现有一种神奇的\(O(1)\) 查询 lca 的方法,时间优化很明显. main body 倍增法 先讨论倍增法,倍增法求 lc ...

  4. umich cv-2-2

    UMICH CV Linear Classifiers 在上一篇博文中,我们讨论了利用损失函数来判断一个权重矩阵的好坏,在这节中我们将讨论如何去找到最优的权重矩阵 想象我们要下到一个峡谷的底部,我们自 ...

  5. 使用go语言开发hive导出工具

    前言 新版 hive 提供了 beeline 工具,可以执行SQL并导出数据,不过操作还是有点复杂的,团队里有些同学不会Linux的基本操作,所以我花了亿点点时间写了个交互式的命令行工具方便使用. 效 ...

  6. 虹科喜报 | 虹科技术工程师【国内首批】拿下Redis认证开发者证书!

    要说虹科数据库技术工程师有多强悍,认证考试2022年12月上线,次年2月就以全国首批速度强势通过考试,并于两周后正式收到[Redis认证开发人员]证书! 虹科小云忍不住浅浅炫耀一下: 或许大家对Red ...

  7. 字符串表达式计算(a+b/(a-b))的思路与实践

    前言 为满足业务需要,需要为项目中自定义模板添加一个计算字段的组件,通过设置字符串表达式,使用时在改变表达式其中一个字段的数据时,自动计算另外一个字段的值. 本篇为上篇,介绍原理,简单实现一个工具,输 ...

  8. 手撕Vuex-实现actions方法

    经过上一篇章介绍,完成了实现 mutations 的功能,那么接下来本篇将会实现 actions 的功能. 本篇我先介绍一下 actions 的作用,然后再介绍一下实现的思路,最后再实现代码. act ...

  9. Vue源码学习(十六):diff算法(三)暴力比对

    好家伙,这是diff的最后一节了   0.暴力比对的使用场景 没有可复用的节点:当新旧虚拟 DOM 的结构完全不同,或者某个节点不能被复用时,需要通过暴力比对来创建新的节点,并在真实 DOM 上进行相 ...

  10. (Good topic)快慢指针:链表的中间结点 (3.23leetcode每日打卡)

    给定一个带有头结点 head 的非空单链表,返回链表的中间结点. 如果有两个中间结点,则返回第二个中间结点.   示例 1: 输入:[1,2,3,4,5]输出:此列表中的结点 3 (序列化形式:[3, ...