文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Python 获取本月的最后一天

2023-01-31 08:23

关注

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

 

有没有办法使用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


阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯