Python时间处理常用操作

98 阅读1分钟

知识储备

实际例子

判断当前是否处在某个时间范围内(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的区别

image.png