阅读本文大概需要4分钟
上一篇我们学习了Python关于时间,日期,日历的一些基本用法,现在我们通过两个精选例子让你融汇贯通,快来看看吧
1.计算生日是星期几
当你女朋友要过生日了,你肯定要定找家饭店订个餐庆祝一下,餐馆工作日会空一些,周末位置不好定,要是能知道她的生日是星期几就好了,下面这个程序就能搞定~~
比如girl friend 的生日假设是 gf_birthday='2017-3-3'
1).我们先把变量格式化成一个datetime对象
birthday=datetime.datetime.strptime(gf_birthday,'%Y-%m-%d')
2).然后利用datetime里面的函数weekday来得到一个下标
birthday.weekday()
3).构造一个weekdays的列表,根据下标从列表里面取出是周几
weekdays=['Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sunday']
weekdays[birthday.weekday()]
当然你要计算比如情人节,圣诞节什么的都可以用上面的程序,或者整个列表把10年的节日都罗列计算一下都是可以了,是不是很简单,对日期的理解有木有加深了一下下
2.定时任务
在Python里面,比如你想定期去爬一个网页,或者做运维的同学想每天12点去定时download一个文件,或者定时去扫描一些服务器,甚至老板的需求不停的变可能是,每隔5分钟,或者每小时的整点10分,每周每月都有一些定时任务
用Python怎么破很简单,下面这个程序轻松搞定
我们先从一个最简单的例子说,假设我们是每分种的第10秒,去执行一个任务去打印一下当前的目录
1).window下是dir命令,linux是ls
我们用platform这个模块来判断一下操作系统
import platform
os_platfrom=platform.platform()
if os_platfrom.startswith('Darwin'):
print'this is mac os system'
os.system('ls')
elif os_platfrom.startswith('Window'):
print'this is win system'
os.system('dir')
2).如何定时执行
a.我们先获取当前的时间
now=datetime.datetime.now()
假设当前时间是2017-02-09 20:19:47.555000
b.然后我们输入一个你要定时执行的target时间
比如你是x分10秒的时候执行sched_Timer=datetime.datetime(x,x,x,x,x,10)
前面的x是并不重要(只要最后是10秒就行了),我们就把目标时间设的比当前晚一点即可:
sched_Timer=datetime.datetime(2017,2,9,20,20,10)
c.好当时间到了20:20:10的时候要运行我们的程序
如何定时到了呢,很简单用
if now==sched_Timer:
'run Task'
d.那么如何让时间在下一分钟10秒继续执行呢,也很简单用timedelta()
datetime.timedelta(minutes=1)把target时间往后增加一分钟
sched_Timer=sched_Timer+datetime.timedelta(minutes=1)
然后外边用个while 死循环hold住就可以了
同样的这个代码也可以扩展,把minutes=1改成hours=1就变成了每个小时定时任务,改成days=1就变成每天的定时任务
大家可以直接动手练习一下,如果需要源码的同学请后台跟我联系,留言
网友评论
遇到疑问,
假设 我要 每分钟的42秒执行 里面的job,
再假设,我要 每个十分钟里的7分42秒执行一次 job呢?
即7分42秒,17分42秒,27分42秒,37分42秒,47分42秒,57分42秒,如此循环下去
看要求应该是每十分钟的7分42秒执行job,
若代码运行的时间是,6分10秒,程序如何在7分42秒执行一次job,然后每十分钟的7分42秒执行job
请前辈指点。谢谢
比如
['7:42','17:42','27:42','37:42','47:42','57:42'],然后和 datetime.datetime.now().strftime('%M:%S') 做判断,相同就执行,
如下:
import datetime
def timerFun(sched_Timer):
flag=0
while True:
now=datetime.datetime.now()
now=now.strftime('%Y-%m-%d %H:%M:%S')
now=datetime.datetime.strptime(now,'%Y-%m-%d %H:%M:%S')
sched=datetime.datetime.strptime(str(sched_Timer),'%Y-%m-%d %H:%M:%S')
if (now==sched):
run_Task()
flag=1
else:
if flag==1:
sched_Timer=sched_Timer+datetime.timedelta(minutes=1) #下一分钟10秒继续执行把minutes=1改成hours=1就变成每小时定时
flag=0
import time
def run_Task():
# os.system('python every_hour_task.py')
print("ceshi")
def timerFun (sched_Timer):
flag = 0
while True:
now = time.localtime()
# 每小时执行一次,即当分钟相等时执行
if now.tm_min == sched_Timer.tm_min:
run_Task()
# 为避免一分钟执行多次,休眠一分钟
time.sleep(60)
if __name__ == '__main__':
sched_Timer = time.strptime("2017-11-16 19:40:00","%Y-%m-%d %H:%M:%S")
print("run the timer task at {0}", time.strftime("%Y-%m-%d %H:%M:%S", sched_Timer))
timerFun(sched_Timer)
这块有点问题,会出现重复运行的情况,可以改成这样
if (now == self.schedule_timer) & (flag == 0):
推荐下,分布式作业中间件 Elastic-Job 源码解析 16 篇:http://t.cn/R05mBNd
勒
#设定开始时间start_time
sched_time = datetime.datetime(2017, 8, 19, 10, 53, 00)
#间隔时间
timedelta=datetime.timedelta(minutes=1)
#取当下时间
now = datetime.datetime.now()
#判断是否开始时间已错过,如果结果为负数,则提示错误
if str(sched_time-now)[0]=='-':
print ('开始时间已经错过,请重新调整开始时间')
else:
while True:
now = str(datetime.datetime.now())[:-7]
if now==str(sched_time):
print (sched_time)
sched_time=str(datetime.datetime.now()+timedelta)[:-7]
print (sched_time)
print ('请在这里开始你的程序')
time.sleep(1)
print (now)
我贴个github网址试试
https://github.com/wjb711/Opencv_learning/tree/master/%E5%AE%9A%E6%97%B6%E5%99%A8
在while循环中,datetime.datetime.now()获取的时间是“2017-8-10 17:22:54.123456”这种格式的,而楼主设置的时间格式 print 出来默认是“2017-8-10 17:22:54”,可能是程序运行时间的因素,实际运行过程中判定二者相等,进而执行if内的语句的情况很少出现(我这里尝试了半个下午,没有一次判定二者相等)。
下面是我自己稍作修改后自行使用的:
import time
sched_time = datetime.datetime(2017, 8, 10, 17, 31, 0)
loopflag = 0
while True:
now = datetime.datetime.now()
if sched_time<now<(sched_time+datetime.timedelta(seconds=1)):
loopflag = 1
time.sleep(1)
if loopflag == 1:
func() #此处为你自己想定时执行的功能函数
loopflag = 0
time.sleep(1)
print(now)
flag = 1