一、需求

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

二、获取本月最后一天

有没有办法使用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 = '' # 系统账户密码 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

Python 获取本月的最后一天的更多相关文章

  1. java获取本月开始时间和结束时间、上个月第一天和最后一天的时间以及当前日期往前推一周、一个月

    import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.uti ...

  2. java获取本月第一天和最后一天

    public class CalendarTest { public static void main(String[] args) { // 获取当前年份.月份.日期 Calendar cale = ...

  3. Sybase:获取本月最后一天的日期的实现方法

    Sybase:获取本月最后一天的日期的实现方法 Oracle中查询月底那天的日期的函数为:last_day(). 在ASE中没有对应的函数,在Oracle移植到Sybase的时候,需要手动编写函数来实 ...

  4. moment.js(moment-in-node.js)获取本月最后一天 不指定

    http://tommyhu.cn/moment-in-nodejs/ //获取本月最后一天 to=using.moment(日期).endOf('month').format("YYYY- ...

  5. [python实用代码片段]python获取当前时间的前一天,前一周,前一个月

    python获取当前时间的前一天,前一周,前一个月. 实用python的datetime.timedelta方法,避免了有的月份是30和31等不同的情况. 获取前一个月的时间,方法实现:首先datet ...

  6. [Java] 获取本月周次和日期时间段信息

    package com.wdcloud.monitoring.common; import java.text.SimpleDateFormat; import java.util.ArrayList ...

  7. mysql日期 获取本月第一天 获取下个月的第一天

    --获取当前日期 select curdate(); --获取当月最后一天 select last_day(curdate()); --获取本月第一天 select DATE_ADD(curdate( ...

  8. MySQL 获取本月第一天、下个月第一天等

    select curdate(); --获取当前日期 select last_day(curdate()); --获取当月最后一天. select DATE_ADD(curdate(),interva ...

  9. 使用shell/python获取hostname/fqdn释疑

    一直以来被Linux的hostname和fqdn(Fully Qualified Domain Name)困惑了好久,今天专门抽时间把它们的使用细节弄清了. 一.设置hostname/fqdn 在Li ...

随机推荐

  1. 20-ESP8266 SDK开发基础入门篇--C# TCP客户端编写 , 加入数据通信

    https://www.cnblogs.com/yangfengwu/p/11192594.html 自行调整页面 连接上以后主动发个数据 namespace TCPClient { public p ...

  2. BZOJ 1213: [HNOI2004]高精度开根

    二次联通门 : BZOJ 1213: [HNOI2004]高精度开根 正解 NTT+高精+倍增+二分 但是可以用python 2333333 m,n=int(raw_input()),int(raw_ ...

  3. shell脚本编程基础之while、for、until循环

    while及until循环结构 while CONDITION:do statement done 进入循环:条件满足 退出循环:条件不满足 当需要命令的执行状态返回值时,可以直接把整个命令当做循环的 ...

  4. es6学习3:promise

    promise含义: 所谓Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果. 从语法上说,Promise 是一个对象,从它可以获取异步操作的消息.Pro ...

  5. AOP通知类型

    AOP通知类型 前置通知 在目标方法执行之前进行操作 后置通知 在目标方法执行之后 进行操作 环绕通知 在目标方法执行之前 和之后进行操作 public Object arount() 异常抛出通知 ...

  6. jmeter元件作用及执行顺序

    jmeter是一个开源的性能测试工具,它可以通过鼠标拖拽来随意改变元件之间的顺序以及元件的父子关系,那么随着它们的顺序和所在的域不同,它们在执行的时候,也会有很多不同. jmeter的test pla ...

  7. 从ReentrantLock的实现看AQS的原理及应用 可重入锁

    https://mp.weixin.qq.com/s/sA01gxC4EbgypCsQt5pVog

  8. implement a list using Rust

    Rust果然比較複雜,在經歷了n次compile fail,終于寫成了一個 list 難點: 對Rc<>的用法不熟悉.對borrow checker不夠熟悉 有些寫法可能還不是最短的 us ...

  9. EasyUi datagrid列表增加复选框

    本文为博主原创,未经允许不得转载 1.增加复选框列 {     field: 'oid',     title: '<input type=\"checkbox\" name ...

  10. django -xadmin 详解 功能实现及orm 的复习

    django 在xadmin中自定义内容的变量及优化汇总 一: 首先下载xadmin pip install git+git://github.com/sshwsfc/xadmin.git@djang ...