Python 獲取本月的最後一天

1、需求

如今有一個場景,須要每個月的最後一天,發送一封郵件。html

 

2、獲取本月最後一天

有沒有辦法使用Python的標準庫輕鬆肯定(即一個函數調用)給定月份的最後一天?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)
View Code

 

執行輸出:ide

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')
View Code

 

執行輸出:函數

no

 

3、發送郵件

發送郵件部分,參考連接:ui

http://www.javashuo.com/article/p-suzbljwg-gb.htmlthis

 

代碼結構

./
├── 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('發送失敗!')
View Code

 

alert.pyspa

#!/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()
View Code

 

執行 alert.py,輸出:3d

不是月末

 

任務計劃

定義Linux任務計劃,天天早上9點執行一次。

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

 

 

本文參考連接:

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

相關文章
相關標籤/搜索