知识储备
实际例子
判断当前是否处在某个时间范围内(python2)
要点在于实现字符串转datetime对象,以及时区统一转换为北京时间后再进行比较
# coding=utf-8
from datetime import datetime, timedelta, timeinfo
from xxx import logger
# 判断当前时间是否处于[start_time_str, end_time_str]的时间范围内(一律视为北京时间)
def _now_in_time_range(time_range=None):
try:
if not bool(time_range):
# 如果为None或[]等空值的话,视为无时间限制
return True
start_time_str, end_time_str = time_range
format = '%Y-%m-%d %H:%M:%S'
beijing = UTC(8)
start_dt = datetime.strptime(start_time_str, format).replace(tzinfo=beijing)
end_dt = datetime.strptime(end_time_str, format).replace(tzinfo=beijing)
now_dt = datetime.now().replace(tzinfo=beijing)
return (start_dt < now_dt) and (now_dt < end_dt)
except Exception as e:
msg = '[_now_in_time_range] 出错了' + str(e)
logger.error(msg)
raise Exception(msg)
"""
tzinfo是关于时区信息的类
tzinfo是一个抽象类,所以不能直接被实例化,需要自己写一个子类去继承并实现其方法
"""
class UTC(tzinfo):
"""Fixed offset in hours east from UTC."""
def __init__(self, offset = 0):
self.__offset = timedelta(hours = offset)
self.__name = 'UTC' + str(offset)
def utcoffset(self, dt):
return self.__offset
def tzname(self, dt):
return self.__name
def dst(self, dt):
return timedelta(0)
需要注意的是,本例中转换时区用到的replace方法和另一方法astimezone的区别