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.')
输出结果如下:
三 以下代码主要包含以下功能
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)
推荐阅读