实用向Time相关模块 - 成为python时间管理大师吧

前言

大家好,我是Samaritan。
Python中有不少基础又实用的模块,甚至是无需安装的标准库。其中大家最先想到的可能就是time了,反正我第一个接触的模块和用法就是:

import time
time.sleep(sec)

当然啦,还有random、math、tutle和smtplib(上一篇已经简单讲啦)等等也都是如此,有机会我再写博文引申出去。
因为今天我们文章的主题是:如何成为时间管理大师
咳咳…错了,是关于时间(和日期)的相关模块及其用法~
简单学过python基础语法的朋友可能就要吐槽这也太基础了吧?别急,“时间”也许就是你最熟悉的陌生人。我们就从time开始说起。

一、Time模块

Python 程序能用很多方式处理日期和时间,转换日期格式是一个常见的功能。
Time有三种格式:
时间戳(time_stamp)类型为浮点(float)
自定义的格式型字符串时间(format_time)类型为字符串(str)
时间元组(struct_time)
举例说明:

import time
time.time()
#获取当前时间戳
time.strftime('%Y-%m%d %H:%M:%S')
#获取自定义格式的字符串时间,下面会介绍各种格式化符号
time.localtime()
#获取当前本地时间元组

print输出:
1591655104.5793982
time.struct_time(tm_year=2020, tm_mon=6, tm_mday=9, tm_hour=6, tm_min=25, tm_sec=4, tm_wday=1, tm_yday=161, tm_isdst=0)
2020-0609 06:25:04

需要知道:每个时间戳都以自从 1970 年 1 月 1 日午夜(历元)经过了多长时间来表示。时间间隔是以秒为单位的浮点小数。

时间日期格式化符号:
%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 当前时区的名称
%% %号本身

常用格式转换:

time.localtime(浮点)
#时间戳转时间元组
time.strftime(格式化符号, 时间元组)
#时间元组转格式化时间
time.strptime(格式化时间, 格式化符号)
#格式化时间转时间元组
time.mktime(时间元组)
#时间元组转时间戳

常用方法:

import time
#计时器
start = time.time()#获取当前时间戳
time.sleep(2)#防止太快结束看不清结果,睡眠2秒
end = time.time()#再次获取当前时间戳
print(end - start)#时间戳相减得到用时秒数

输出结果:
2.0007362365722656
#得到了程序共运行耗时(秒)

这样就是一个最简易的计时器啦。再来看看另一种计时方法:

start1 = time.perf_counter()
start2 = time.process_time()
time.sleep(2)
end1 = time.perf_counter()
end2 = time.process_time()
print(end1 - start1)
print(end2 - start2)

输出结果:
2.0001126840000003
0.0

看出区别了吗?
time.perf_counter()返回计时器的精准时间(系统的运行时间),包含整个系统的睡眠时间。由于返回值的基准点是未定义的,所以,只有连续调用的结果之间的差才是有效的。
time.process_time()返回当前进程执行 CPU 的时间总和,不包含睡眠时间。由于返回值的基准点是未定义的,所以,只有连续调用的结果之间的差才是有效的。

除了刚才说过的获取当前本地时间元组外,还有方法可以获得格林威治时间。

now = time.gmtime()
#接收时间戳并返回格林威治天文时间下的时间元组,默认当前时间。
date = time.strftime('%Y-%m%d %H:%M:%S',date)
#将时间戳转为当前格林威治时间字符串

print结果:
time.struct_time(tm_year=2020, tm_mon=6, tm_mday=8, tm_hour=23, tm_min=24, tm_sec=37, tm_wday=0, tm_yday=160, tm_isdst=0)
2020-0608 23:24:37

再来看看两个其他转换方式
asctime() 将以日期元组或者struct_time表示的时间转化为字符串,不指定参数则默认是当前时间
ctime() 以秒代表的时间转换为字符串, 不指定参数则默认是当前时间

time.asctime((2077,1,1,8,10,10,3,1,0))#有日期元组参数
time.asctime()#无参数
time.ctime(999999999)#有秒数(自1970年1月1日午夜)
time.ctime()#无参数

print结果:
Thu Jan  1 08:10:10 2077
Tue Jun  9 07:46:46 2020
Sun Sep  9 09:46:39 2001
Tue Jun  9 07:46:46 2020

可以看出这种方式下我们除了年月日时间外还可以得到星期几,无参数时time.ctime()相当于time.asctime()。
现在你已经学会了通过时间戳(秒数)进行加减来实现计时器等功能,那接着我们再来看看对日期又能如何操作呢?

二、Datetime模块

Datetime模块为日期和时间处理同时提供了简单和复杂的方法。支持日期和时间算法的同时,实现的重点放在更有效的处理和格式化输出。
我们从几个现实中的问题来看看datetime模块是怎么帮助我们的吧。
通过生日来计算一个人的年龄很容易,但是如果想知道出生至今经过了多少天呢?
用datetime可以这样实现:

from datetime import datetime#从datetime模块导入datetime类方法
#年龄计算
today = datetime.now()#返回当前日期时间的datetime对象
birthday = datetime(1990,11,4
  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值