欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

python进阶宝典15- 时间管理

程序员文章站 2022-05-02 19:02:30
...

一   主要内容包含time.time(), time.sleep(),及 datetime模块等内容,具体详见代码注释。

## time.time()返回自unix纪元1970年1月1日0点(UTC)那一刻依赖的秒数,称为unix纪元时间戳
#   另一种分析代码的方法是利用cProfile.run()函数,比time.time()方法提供了更详细的信息。
#                  参考 https://docs.python.org/3/library/profile.html 说明。
import time
def calcProd():
    # Calculate the product of the first 100000 numbers.
    product = 1
    for i in range(1,100000):
        product = product * i
    return product

startTime = time.time()           # 生成时间戳
prod = calcProd()
endTime = time.time()
print('The result is %s digits long.' % (len(str(prod))))
print('Took %s seconds to calculate.' % (endTime - startTime))

## time.sleep()
import time
time.sleep(30)
# 上面调用用来暂停30秒,注意,此时按下Ctrl-C不会中断sleep()调用,程序会等待暂停结束,再抛出KeyboardInterrupt异常。
# 要绕过这个问题,要用如下的30次循环调用来解决。
for i in range(30):
    time.sleep(1)

二 下面是一个例子描边,每一次按下回车后显示当前一轮的时间,及累积时间。

## 例子:秒表
# A simple stopwatch program.
import time
# Display the program's instructions.
print('Press ENTER to begin. Afterwards,press ENTER to "click" the stopwatch.Press Ctrl-C to quit.')
input()                      # Press Enter to begin
print('Started.')
startTime = time.time()      # Get the first lap's start time
lastTime = startTime
lapNum = 1
# Start tracking the lap times.
try:
    while True:
        input()
        lapTime = round(time.time() - lastTime, 2)
        totalTime = round(time.time() - startTime, 2)
        print('Lap #%s: %s (%s)' % (lapNum,totalTime,lapTime),end='') 
        # 由于前面有个input(),这里向print()函数传入 end='' ,避免输出重复空行
        lapNum += 1
        lastTime = time.time()    # reset the last lap time
except KeyboardInterrupt:
    # Handle the Ctrl-C exception to keep its error message from displaying.
    print('\nDone.')

输出结果如下:

python进阶宝典15- 时间管理

三  以下代码主要包含以下功能

1) datetime模块,datetime值表示一个具体的时刻

2)timedelta数据类型 ,表示一段时间

3)将datetime对象转换为字符串 strftime()

4)将字符串转换成 datetime对象 strptime()

具体代码如下:

## datetime模块,datetime值表示一个具体的时刻
import datetime
datetime.datetime.now()             # datetime.datetime(2018, 5, 20, 16, 22, 52, 718197)
print(datetime.datetime.now())      # 2018-05-20 16:26:38.948846
dtnow = datetime.datetime.now()
dt = datetime.datetime(2015,10,21,16,29,0)
print(dt)                           # 2015-10-21 16:29:00
print(dtnow > dt)                   # True 两个datetime对象可以比较大小
# fromtimestamp() 将unix纪元时间戳后秒数转换为 datetime对象
print(datetime.datetime.fromtimestamp(1000000))  # 1970-01-12 21:46:40  datetime.datetime(1970, 1, 12, 21, 46, 40)
datetime.datetime.fromtimestamp(time.time())     # 同datetime.datetime.now() 

## timedelta数据类型 ,表示一段时间,而不是一个时刻
# datetime.timedelta() 函数接受关键字参数weeks、days、hours、minutes、seconds、milliseconds及microseconds.
#    由于年、月时间不固定,没有year、month关键字参数。
delta = datetime.timedelta(weeks=2,days=11,hours=10,minutes=9,seconds=8)
print(delta.days,delta.seconds,delta.microseconds)   # timedelta对象拥有的总时间以天、秒、微妙来表示
print(delta.total_seconds())                         # total_seconds() 返回只以秒表示的总时间
str(delta)                                           # '25 days, 10:09:08' 转换为字符串的样子
# timedelta对象 可以与datetime对象或其他timedelta对象进行加减
dt = datetime.datetime.now()
kdays = datetime.timedelta(days=1000)
kdays = datetime.timedelta(days=500 * 2)
print(dt + kdays)                                    # datetime.datetime(2021, 2, 13, 16, 48, 23, 473549)
print(dt - (2 * kdays) )                             # timedelta对象可以乘以或除以整数或浮点数

## 控制程序暂停到某个时间
import datetime,time
t2018 = datetime.datetime(2018,10,31,0,0,0)
t = 1
try:
    while datetime.datetime.now() < t2018 :
        time.sleep(1)
        t += 1
except KeyboardInterrupt:
    print('%s seconds have gone.' % (t))
print('Time is ok,Go...')

## 将datetime对象转换为字符串 strftime()
import datetime
dt = datetime.datetime(2017,4,21,16,29,0)
dt.strftime('%Y/%m/%d %H:%M:%S')       # '2017/04/21 16:29:00'
dt.strftime("%B of '%y   %I:%M %p , %A , %w th day of week, %j th day of year")
#"October of '15   04:29 PM , Wednesday , 3 th day of week, 294 th day of year"

## 将字符串转换成 datetime对象 strptime()
# 注意必须将对应第一个参数的定制格式字符串作为第二个参数输入
import datetime
datetime.datetime.strptime('2018/05/20 16:30:00','%Y/%m/%d %H:%M:%S')
#         datetime.datetime(2018, 5, 20, 16, 30)