Python——第五章:time模块、datetime模块

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取代了

posted @ 2023-12-05 16:39  Magiclala  阅读(9)  评论(0编辑  收藏  举报