Python 获取本月的最后一天

发布时间:2020-02-24 09:42:50编辑:admin阅读(2663)

    一、需求

    现在有一个场景,需要每月的最后一天,发送一封邮件。

     

    二、获取本月最后一天

    有没有办法使用Python的标准库轻松确定(即一个函数调用)给定月份的最后一天?

    答案是有的,使用 datetime 就可以实现

    #!/usr/bin/env python
    # coding: utf-8
    
    import datetime
    
    def last_day_of_month(any_day):
        """
        获取获得一个月中的最后一天
        :param any_day: 任意日期
        :return: string
        """
        next_month = any_day.replace(day=28) + datetime.timedelta(days=4)  # this will never fail
        return next_month - datetime.timedelta(days=next_month.day)
    
    # 注意: 年月日,这些变量必须是数字,否则报错!
    year = 2019 # 年
    month = 5  # 月
    day = 16 # 日
    
    res = last_day_of_month(datetime.date(year, month, day))
    print(res)

     

    执行输出:

    2019-05-31

     

    判断当天是否为月末

    #!/usr/bin/env python3
    # coding: utf-8
    
    import datetime
    
    def last_day_of_month(any_day):
        """
        获取获得一个月中的最后一天
        :param any_day: 任意日期
        :return: string
        """
        next_month = any_day.replace(day=28) + datetime.timedelta(days=4)  # this will never fail
        return next_month - datetime.timedelta(days=next_month.day)
    
    
    # 当前日期
    now = datetime.datetime.now().date()
    year,month,day = str(now).split("-")  # 切割
    # 年月日,转换为数字
    year = int(year)
    month = int(month)
    day = int(day)
    
    # 获取这个月最后一天
    last_day = last_day_of_month(datetime.date(year, month, day))
    
    # 判断当前日期是否为月末
    if str(now) == last_day:
        print('yes')
    else:
        print('no')

    执行输出:

    no

     

    三、发送邮件

    发送邮件部分,参考链接:

    https://www.cnblogs.com/xiao987334176/p/10022026.html

     

    代码结构

    ./
    ├── send_mail.py
    └── alert.py

    send_mail.py

    #!/usr/bin/env python3
    # coding: utf-8
    """
    发送邮件
    """
    
    import sys
    import smtplib  # 加载smtplib模块
    from email.mime.text import MIMEText
    from email.utils import formataddr
    
    
    class SendMail(object):
        def __init__(self, sender, title, content):
            self.sender = sender  # 发送地址
            self.title = title  # 标题
            self.content = content  # 发送内容
            self.sys_sender = '123456@163.com'  # 系统账户
            self.sys_pwd = '123456'  # 系统账户密码
    
        def send(self):
            try:
                """
                构造一个邮件对象,
                第一个参数就是邮件正文,
                第二个参数是MIME的subtype,传入'html',最终的MIME就是'text/html'。
                最后一定要用utf-8编码保证多语言兼容性。
                """
                msg = MIMEText(self.content, 'html', 'utf-8')
                # 发件人格式
                msg['From'] = formataddr(["IT事业部系统", self.sys_sender])
                # 收件人格式
                msg['To'] = formataddr(["", self.sender])
                # 邮件主题
                msg['Subject'] = self.title
                # SMTP服务器
                server = smtplib.SMTP("smtp.163.com", 25)
                # 登录账户
                server.login(self.sys_sender, self.sys_pwd)
                # 发送邮件
                server.sendmail(self.sys_sender, [self.sender, ], msg.as_string())
                # 退出账户
                server.quit()
                return True
            except Exception as e:
                print(e)
                return False
    
    
    if __name__ == '__main__':
        # 参数个数,由于sys.argv[0]就是脚本名,所以要减1
        num = len(sys.argv) - 1
        if num < 3 or num > 3:
            exit("参数错误,必须传3个参数!当前参数个数为%s" % num)
    
        sender = sys.argv[1]  # 发送地址
        title = sys.argv[2]  # 标题
        content = sys.argv[3]  # 发送内容
    
        # 调用send方法,发送邮件
        ret = SendMail(sender, title, content).send()
        if ret:
            print('发送成功!')
        else:
            print('发送失败!')

     

    alert.py

    #!/usr/bin/env python3
    # coding: utf-8
    """
    月末发送一封邮件
    """
    
    import datetime
    from send_mail import SendMail
    
    class AlertServices(object):
        def __init__(self):
            pass
    
        def last_day_of_month(self,any_day):
            """
            获取获得一个月中的最后一天
            :param any_day: 任意日期
            :return: string
            """
            next_month = any_day.replace(day=28) + datetime.timedelta(days=4)  # this will never fail
            return next_month - datetime.timedelta(days=next_month.day)
        
        def main(self):
            """
            主程序
            :return: 
            """
            
            # 当前日期
            now = datetime.datetime.now().date()
            year,month,day = str(now).split("-")  # 切割
            # 年月日,转换为数字
            year = int(year)
            month = int(month)
            day = int(day)
            
            # 获取这个月最后一天
            last_day = self.last_day_of_month(datetime.date(year, month, day))
            
            # 判断当前日期是否为月末
            if str(now) != last_day:
                print("不是月末")
                return False
            
            # 发送邮件
            sender = "12345678@qq.com"  # 发送地址
            title = "月末提醒"  # 标题
            content = "还不快点写报告"  # 发送内容
    
            # 调用send方法,发送邮件
            ret = SendMail(sender, title, content).send()
            if ret:
                print('发送成功!')
            else:
                print('发送失败!')
                
    if __name__ == '__main__':
        # 执行主程序
        AlertServices().main()

     

    执行 alert.py,输出:

    不是月末

     

    任务计划

    定义Linux任务计划,每天早上9点执行一次。

    0 9 * * * root /usr/bin/python3 /opt/alert/alert.py

     

     

    本文参考链接:

    https://cloud.tencent.com/developer/ask/188186


关键字