mirror of https://github.com/FanbeiFan/JD-SHOPPER
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
157 lines
5.4 KiB
157 lines
5.4 KiB
import datetime |
|
import time |
|
from Logger.logger import logger |
|
|
|
|
|
class Timer(object): |
|
|
|
def __init__(self, task, startTime, skipWeekend): |
|
'''初始化''' |
|
self.task = task |
|
self.start_time = startTime |
|
self.skip_weekend = skipWeekend |
|
|
|
def schedule(self): |
|
'''调度执行上下文''' |
|
while True: # 一个循环为一天时间 |
|
self._schedule() # 进入今天的循环 |
|
self.sleepToTomorrow() # 今天的任务结束,休眠到下一天 |
|
|
|
def _schedule(self): |
|
'''调度执行''' |
|
|
|
logger.info("Daily Task Initialized Successfully") |
|
|
|
if self.skip_weekend and not self.isTodayWorkday(): |
|
# 今天不是工作日,结束今天的任务 |
|
return False |
|
|
|
elif self.isTimePass(): |
|
# 今天的任务时间已经过了,结束今天的任务 |
|
return False |
|
|
|
else: |
|
self.execute() |
|
return True |
|
|
|
def execute(self): |
|
real_datetime = self.realDate() # 当前的时间(日期) |
|
real_mstime = self.dateMSTime(real_datetime) # 当前的时间(毫秒) |
|
today_task_datetime = self.todayTaskTime() # 今天任务时间(日期) |
|
today_task_mstime = self.dateMSTime(today_task_datetime) # 今天任务时间(毫秒) |
|
wait_time = today_task_mstime - real_mstime # 获取当前时间与任务的时间差 |
|
logger.info("Waiting to Start Mission -> {}".format(today_task_datetime)) |
|
time.sleep(wait_time) # 线程休眠阻塞任务 |
|
self.task() # 阻塞结束执行 |
|
logger.info("Today's Mission Completed") |
|
|
|
|
|
def realDate(self): |
|
''' |
|
获取当前的日期与时间 |
|
return: date "%Y-%m-%d %H:%M:%S" |
|
''' |
|
localtime = time.localtime(time.time()) |
|
date = \ |
|
localtime.tm_year.__str__() + '-' + \ |
|
localtime.tm_mon.__str__() + '-' + \ |
|
localtime.tm_mday.__str__() + ' ' + \ |
|
localtime.tm_hour.__str__() + ':' + \ |
|
localtime.tm_min.__str__() + ':' + \ |
|
localtime.tm_sec.__str__() |
|
return date |
|
|
|
def realMSTime(self): |
|
''' |
|
获取当前的毫秒时间 |
|
return: 毫秒时间 |
|
''' |
|
return time.time() |
|
|
|
def tomorrowMSTime(self): |
|
''' |
|
获取明天的00:00:00毫秒时间 |
|
return: 毫秒时间 |
|
''' |
|
localtime = time.localtime(time.time()) |
|
# 今天00:00:00的日期时间 |
|
today_start_date = \ |
|
localtime.tm_year.__str__() + '-' + \ |
|
localtime.tm_mon.__str__() + '-' + \ |
|
localtime.tm_mday.__str__() + ' ' + \ |
|
'00:00:00' |
|
today_start_time = self.dateMSTime(today_start_date) |
|
tomorrow_start_time = today_start_time + 60 * 60 * 24 |
|
return tomorrow_start_time |
|
|
|
def isTodayWorkday(self): |
|
''' |
|
该日期是否为工作日 |
|
params: |
|
date "%Y-%m-%d %H:%M:%S" |
|
return: |
|
工作日: True |
|
休息日: False |
|
''' |
|
localtime = time.localtime(time.time()) |
|
week = localtime.tm_wday.__str__() |
|
if week in (5, 6): |
|
# 如果是休息日 |
|
logger.info("Over The Weekend") |
|
return False |
|
else: |
|
# 如果是工作日 |
|
logger.info("Working Day") |
|
return True |
|
|
|
def sleepToTomorrow(self): |
|
'''休眠到下一天''' |
|
real_datetime = self.realDate() # 当前的时间(日期) |
|
real_mstime = self.dateMSTime(real_datetime) # 当前的时间(毫秒) |
|
tomorrow_mstime = self.tomorrowMSTime() # 明天0点的时间(毫秒) |
|
diff_time = tomorrow_mstime - real_mstime # 现在到明天0点的毫秒时间 |
|
logger.info("Sleeping to tomorrow -> {} Seconds".format(diff_time)) |
|
time.sleep(diff_time) |
|
|
|
def isTimePass(self): |
|
''' |
|
确认当前时间是否超过今天执行时间 |
|
return: |
|
True:超时 |
|
False:没超时 |
|
''' |
|
real_datetime = self.realDate() # 当前的时间(日期) |
|
real_mstime = self.dateMSTime(real_datetime) # 当前的时间(毫秒) |
|
today_task_datetime = self.todayTaskTime() # 今天任务时间(日期) |
|
today_task_mstime = self.dateMSTime(today_task_datetime) # 今天任务时间(毫秒) |
|
if real_mstime > today_task_mstime: |
|
logger.info("Time Pass - Now Time: {} TaskTime: {}".format(real_datetime, today_task_datetime)) |
|
return True |
|
else: |
|
logger.info("Time Waiting - RealTime: {}".format(real_datetime)) |
|
return False |
|
|
|
def dateMSTime(self, date): |
|
''' |
|
获取该日期对应的毫秒时间 |
|
params: |
|
date 格式为"%Y-%m-%d %H:%M:%S" |
|
return: |
|
ms_time 毫秒时间 |
|
''' |
|
date_time = datetime.datetime.strptime(date, "%Y-%m-%d %H:%M:%S") |
|
ms_time = int(time.mktime(date_time.timetuple()) + date_time.microsecond) |
|
return ms_time |
|
|
|
def todayTaskTime(self): |
|
''' |
|
获取今天的任务日期 |
|
return: today_date "%Y-%m-%d %H:%M:%S" |
|
''' |
|
localtime = time.localtime(time.time()) |
|
today_date = \ |
|
localtime.tm_year.__str__() + '-' + \ |
|
localtime.tm_mon.__str__() + '-' + \ |
|
localtime.tm_mday.__str__() + ' ' + \ |
|
self.start_time |
|
return today_date
|
|
|