python初学笔记——Time模块详解

  • 1. 明确几个概念
  • 2.Time模块的内置函数
  • 3.时间戳的计算
  • 4.经典实例——计时器



编程小白的学习笔记

1. 明确几个概念

  • 时间戳:从1970年1月1日午夜(历元)算起,所经过了多长时间来表示,可进行日期计算。
import time
now = time.time()    #time() 返回当前时间戳     #函数前要加模块名
print(now)

>>> 1594910468.9340253 #时间戳单位

  • 时间元组:用9组数字组成一个元组来处理时间。
import time
now = time.localtime(time.time()) #localtime() 接收时间戳,返回时间元祖
print(now)

>>> time.struct_time(tm_year=2020, tm_mon=7, tm_mday=16, tm_hour=16, tm_min=58, tm_sec=28, tm_wday=3, tm_yday=198, tm_isdst=1)

9组数字

属性

值(例子)

0

tm_year(四位数的年)

2020

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(60或61为闰秒)

6

tm_wday(一周的第几天)

0-6(0为周一)

7

tm_yday(一年的第几天)

1-366

8

tm_isdst(夏令时)

0,1

  • 格式化时间:将时间输出为你想要的格式。
import time
now=time.strftime('%Y-%m-%d,%H:%M:%S,%',time.localtime(time.time()))
#strftime() 接收时间元祖,返回定义的时间格式
print(now)

>>> 2020-07-16,17:05:20,Thursday

  • python中的时间日期格式符号:

符号

描述

%y

两位数的年份表示(00-99)

%Y

四位数的年份表示(000-9999)

%m

月份(01-12)

%d

月内中的一天(0-31)

%H

24小时制小时数(0-23)

%l

12小时制小时数(01-12)

%M

分钟数(00=59)

%S

秒(00-59)

%a

本地简化星期名称

%A

本地完整星期名称

%b

本地简化的月份名称

%B

本地完整的月份名称

%c

本地相应的日期表示和时间表示

%j

%j 年内的一天(001-366)

%p

%p 本地A.M.或P.M.的等价符

%U

%U 一年中的星期数(00-53)星期天为星期的开始

%w

%w 星期(0-6),星期天为星期的开始

%W

%W 一年中的星期数(00-53)星期一为星期的开始

%x

本地相应的日期表示

%X

本地相应的时间表示

%Z

当前时区的名称

%%

%号本身

2.Time模块的内置函数

#单机左侧函数有详细用法和实例

函数

描述

time.sleep(secs)

推迟调用线程的运行,secs指秒数。

time.time( )

返回当前时间的时间戳(1970纪元后经过的浮点秒数)。

time.localtime([secs])

接收时间戳并返回当地时间下的时间元组t。

time.strftime(fmt[,tupletime])

接收以时间元组,并返回以可读字符串表示的当地时间,格式由fmt决定。

time.asctime([tupletime])

接受时间元组并返回一个可读的形式为"Tue Dec 11 18:07:14 2008"(2008年12月11日 周二18时07分14秒)的24个字符的字符串。

time.clock( )

用以浮点数计算的秒数返回当前的CPU时间。用来衡量不同程序的耗时,比time.time()更有用。

time.altzone

返回格林威治西部的夏令时地区的偏移秒数。如果该地区在格林威治东部会返回负值(如西欧,包括英国)。对夏令时启用地区才能使用。

time.ctime([secs])

作用相当于asctime(localtime(secs)),未给参数相当于asctime()

time.gmtime([secs])

接收时间戳并返回格林威治天文时间下的时间元组t。

time.mktime(tupletime)

接受时间元组并返回时间戳。

time.strptime(str,fmt=’%a %b %d %H:%M:%S %Y’)

根据fmt的格式把一个时间字符串解析为时间元组。

time.tzset()

根据环境变量TZ重新初始化时间相关设置。

3.时间戳的计算

该模块中所有时间计算都是在second(秒)的单位下运行的,注意单位换算。

import time
start_time = time.time()  #开始计时,返回运行该行时的时间戳

………… #代码块

end_time=time.time()  #结束计时
actual_time=int(end_time-start_time)  #始末相减得中间代码的运行时间
#秒换算到分,int((end_time-start_time)/60)

4.经典实例——计时器

重点理解:print("\b"*(len(info)*2),end="",flush=True) 来实现倒计时功能。

import time

input('欢迎使用“时间管理器”!请按回车继续。')

while True:
    task_name=input('请输入任务名:')
    task_time=int(input('你觉得自己至少可以专注这个任务多少分钟?输入 N 分钟'))
    input('此次任务信息:\n我要完成的任务:%s\n我至少要专注:%d分钟\n按回车开始计时:'%(task_name,task_time))
    start=time.time() # 开始计时
    start_time=time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time()))
    # 格式化时间

    #倒计时,range()生成设定的任务时间到0的数字,以-1的步长递减
    for t in range(task_time*60,-1,-1):
        info='请专注任务,还要保持专注'+str(t)+'秒哦!'
        print(info,end='') # 后续打印不换行
        print('\b'*(len(info)*2),end='',flush=True)
        # 转义字符使用时,都需加''
        # len()函数:返回字符串长度
        # '\b'*数字 表示需要退多少格(删除多少字)
        # 必须要加end='',否则无法进行退格,因为不在同一行
        # 1个中文字符==2个英文字符(占位)
        # flush=True 开启缓冲区,相当于刷新,在实现“跳动”功能中非常常见
        # 不加flush会造成拥堵,不能实时显示
        # 将前一次打印的info行全部删除后,并结合循环打印新行,实现倒计时功能
        time.sleep(1) #sleep()函数不能忘,配合循环实现倒计时
    print('你已经专注了 %d 分钟,很棒~再加把劲,完成任务!'%task_time)

    task_status = input('请在任务完成后按输入y:')
    if task_status=='y':
        end=time.time() #结束计时
        end_time=time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time()))
        actual_time=int((end-start)/60)
        # 时间戳的计算,始末相减,运算单位为's',换算为分
        start_end = start_time + '——' + end_time + '\n'

        #将任务记录写入文件中,windows系统用open()函数打开文件时,前加r 或 将\变为\\
        with open(r'f:\onedrive\桌面\timelog3.txt','a',encoding='utf-8') as f:
            f.write(task_name + ' 的预计时长为:' + str(task_time) + '分钟\n')
            f.write(task_name + ' 的实际时长为:' + str(actual_time) + '分钟,具体时间为:' + start_end)
        # with open() as 语句不需要关闭文件

        again=input('建立一个新任务请按 y, 退出时间日志记录器请按 q:')
        # 输入y后,for循环结束,仍在while循环下,只有break语句才能结束
        if again=='q':
            break
    else:
        print('抱歉,你的输入有误。请重启时间记录器。')

print('愿被你善待的时光,予你美好的回赠。')