最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

一文詳解Python中的日期計(jì)算和自動(dòng)化運(yùn)行腳本

 更新時(shí)間:2026年03月31日 09:21:20   作者:mabley  
這篇文章主要為大家詳細(xì)介紹了Python中的日期計(jì)算和自動(dòng)化運(yùn)行腳本的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,有需要的小伙伴可以了解下

一、日期計(jì)算

1. datetime模塊介紹

Python 的 datetime 模塊是處理日期和時(shí)間的核心模塊,提供了多種類和工具,用于操作、格式化和計(jì)算日期時(shí)間。

object
    timedelta     # 主要用于計(jì)算時(shí)間跨度
    tzinfo        # 時(shí)區(qū)相關(guān)
    time          # 只關(guān)注時(shí)間
    date          # 只關(guān)注日期
    datetime      # 同時(shí)有時(shí)間和日期

datetime 模塊和 time 模塊的區(qū)別在于time更接近系統(tǒng)底層,可以理解為 datetime 基于 time 進(jìn)行了封裝,提供了更多實(shí)用的函數(shù)。 

2. 基礎(chǔ)使用

查詢當(dāng)前時(shí)間,并獲取時(shí)間的每個(gè)部分(年月日,時(shí)分秒)。

from datetime import datetime, timedelta

# 1. 獲取當(dāng)前時(shí)間  /  創(chuàng)建自定義時(shí)間
now = datetime.now()
print("當(dāng)前完整時(shí)間:", now)  # 2024-05-20 15:30:45.123456

dt = datetime(2024, 5, 20, 15, 30, 0)  # 年, 月, 日, 時(shí), 分, 秒
print(dt)                   # 2024-05-20 14:30:00


# 2. 訪問(wèn)時(shí)間屬性 (返回值為int類型)
print("\n時(shí)間屬性分解:")
print("年份:", now.year)          # 2024
print("月份:", now.month)         # 5
print("日期:", now.day)           # 20
print("小時(shí):", now.hour)          # 15
print("分鐘:", now.minute)        # 30
print("秒數(shù):", now.second)        # 45
print("微秒:", now.microsecond)   # 123456


# 3. 轉(zhuǎn)換為 date 和 time 對(duì)象
date_part = now.date()
time_part = now.time()
print("\n日期部分:", date_part)  # 2024-05-20
print("時(shí)間部分:", time_part)  # 15:30:45.123456


# 3. date 和 time 對(duì)象轉(zhuǎn)換為 datetime 對(duì)象
new_dt = datetime.combine(date_part, time_part)  
print("\n完整時(shí)間:", new_dt)        # 2024-05-20 15:30:45.123456

3. 時(shí)間計(jì)算

具體時(shí)間的修改,時(shí)間大小的比較(直接使用<, >, ==等運(yùn)算符直接比較 datetime 對(duì)象),時(shí)間的差值計(jì)算。

from datetime import datetime, timedelta

now = datetime.now()

# 1. 使用 replace 修改時(shí)間
new_time = now.replace(year=2025, hour=8)
print("\n修改后的時(shí)間:", new_time)  # 2025-05-20 08:30:45.123456

# 2. 時(shí)間比較
time_1 = datetime(2025,5,20,13,0,0)
time_2 = datetime(2025,5,21,13,0,0)
print(time_1 > time_2)        # False

# 3. 使用timedelta 計(jì)算時(shí)間差
delta = timedelta(days=7, hours=3)
future = now + delta
past = now - delta
print("\n7天3小時(shí)后:", future)
print("7天3小時(shí)前:", past)

4. 時(shí)間的表示與輸出

時(shí)間戳,字符串解析時(shí)間,時(shí)間的字符串表示。

from datetime import datetime, timedelta

now = datetime.now()

# 1. 時(shí)間戳操作
timestamp = now.timestamp()
print("\n當(dāng)前時(shí)間戳:", timestamp)
print("時(shí)間戳還原:", datetime.fromtimestamp(timestamp))


# 2. 從字符串解析時(shí)間(strptime)
custom_str = "2023-12-25 20:15:30"
parsed_time = datetime.strptime(custom_str, "%Y-%m-%d %H:%M:%S")
print("\n解析后的時(shí)間:", parsed_time)


# 3. 格式化輸出(strftime)
formatted = now.strftime("%Y年%m月%d日 %H:%M:%S")
print("\n自定義格式:", formatted)  # 2024年05月20日 15:30:45

5. 工作日計(jì)算

核心方法是weekday方法,基于該方法提供了一些工作日的簡(jiǎn)單計(jì)算函數(shù)。

def is_workday(date):
    """判斷是否為工作日(周一到周五)"""
    # weekday() 返回 0-4=工作日, 5=周六, 6=周日
    return date.weekday() < 5 

def add_workdays(start_day, days):
    """計(jì)算指定工作日后的日期(自動(dòng)跳過(guò)周末)"""
    current = start_day
    added_days = 0
    while added_days < days:
        current += timedelta(days=1)  # 每次加1天
        if is_workday(current):
            added_days += 1
    return current 

def count_workdays(start, end):
    """計(jì)算兩個(gè)日期之間的工作日數(shù)量(包含開始,不包含結(jié)束)"""
    if start > end:
        start, end = end, start

    total_days = (end - start).days
    workdays = 0

    for day in range(total_days):
        current = start + timedelta(days=day)
        if is_workday(current):
            workdays += 1

    return workdays


# 示例:從2024-05-20(周一)計(jì)算5個(gè)工作日后的日期
target_date = add_workdays(start_date, 5)
print(f"\n{start_date.date()} 的5個(gè)工作日后是 {target_date.date()}")  # 2024-05-27


# 示例:計(jì)算2024-05-20 到 2024-05-27 之間的工作日數(shù)量
date_a = datetime(2024, 5, 20)
date_b = datetime(2024, 5, 27)
print(f"\n{date_a.date()} 到 {date_b.date()} 之間的工作日數(shù): {count_workdays(date_a, date_b)}")  # 5

二、APSchedule 腳本運(yùn)行自動(dòng)化

基于Windows 任務(wù)管理器的自動(dòng)化不詳細(xì)描述,需要可以查看這篇文章:在Windows中定時(shí)執(zhí)行Python腳本的詳細(xì)教程

打包為 .exe 文件運(yùn)行的方法在不詳細(xì)描述,需要可以查看這篇文章:Python輕松將腳本打包成EXE應(yīng)用的6種方法實(shí)現(xiàn)與對(duì)比

1. 安裝

APScheduler 支持三種調(diào)度任務(wù):固定時(shí)間間隔,固定時(shí)間點(diǎn),Linux Crontab 命令。同時(shí)還支持異步執(zhí)行、后臺(tái)執(zhí)行調(diào)度任務(wù)。輸入以下命令即可安裝。

pip install APScheduler

2. 簡(jiǎn)單使用

簡(jiǎn)單創(chuàng)建一個(gè)調(diào)度程序步驟只需要三步:

1. 創(chuàng)建調(diào)度器(scheduler)

2. 添加任務(wù)(job)

3. 根據(jù)觸發(fā)條件運(yùn)行調(diào)度任務(wù)。

from apscheduler.schedulers.blocking import BlockingScheduler
from datetime import datetime

# 任務(wù)函數(shù)
def job(message):
    now = datetime.now().strftime("%H:%M:%S")
    print(f"[任務(wù)執(zhí)行] {message} | 時(shí)間: {now}")

# 創(chuàng)建調(diào)度器
scheduler = BlockingScheduler()

# 添加任務(wù)時(shí)直接打印提示
print("[調(diào)度器] 添加間隔任務(wù)(每2秒執(zhí)行)")
scheduler.add_job(job, 'interval', seconds=2, args=['間隔任務(wù)'])

# 啟動(dòng)調(diào)度器
try:
    scheduler.start()
except KeyboardInterrupt:
    print("\n[調(diào)度器] 已停止")

3. 詳細(xì)講解

APSchedule 有四種組件:

1. 調(diào)度器(Scheduler)

2. 作業(yè)存儲(chǔ)(Job Store)

3. 觸發(fā)器(Trigger)

4. 執(zhí)行器(Executor)

3.1 調(diào)度器(Scheduler)

任務(wù)調(diào)度器屬于控制器角色,提供了 7 種調(diào)度器(最常用的是前3種)

種類用法
 BlockingScheduler()當(dāng)前進(jìn)程的主線程中運(yùn)行,阻塞當(dāng)前線程。
 BackgroundScheduler()后臺(tái)線程中運(yùn)行,不會(huì)阻塞當(dāng)前線程。
 AsyncIOScheduler()結(jié)合 asyncio模塊使用。
 GeventScheduler()使用 gevent作為IO模型,和 GeventExecutor 配合使用。
 TornadoScheduler()使用Tornado的IO模型。用 ioloop.add_timeout 完成定時(shí)喚醒。
 TwistedScheduler()配合TwistedExecutor,用 reactor.callLater 完成定時(shí)喚醒。
 QtScheduler()Qt 應(yīng)用需使用QTimer完成定時(shí)喚醒。

它可以配置作業(yè)存儲(chǔ)器和執(zhí)行器。例如添加、修改和移除作業(yè)都可以在調(diào)度器中完成。

方法功能說(shuō)明示例
add_job()  添加新任務(wù)scheduler.add_job(func, 'interval', seconds=5)
remove_job(job_id)刪除任務(wù)scheduler.remove_job('my_job')
pause_job(job_id)暫停任務(wù)scheduler.pause_job('email_job')
resume_job(job_id)恢復(fù)暫停的任務(wù)scheduler.resume_job('report_job')
modify_job(job_id, **kwargs)修改任務(wù)屬性scheduler.modify_job('sync_job', seconds=10)
get_jobs()獲取所有任務(wù)列表jobs = scheduler.get_jobs()

3.2 觸發(fā)器(Trigger)

APScheduler 有三種內(nèi)置的 trigger:

(1)date 是最基本的一種調(diào)度,作業(yè)任務(wù)只會(huì)執(zhí)行一次。它表示特定的時(shí)間點(diǎn)觸發(fā)。

from apscheduler.schedulers.blocking import BlockingScheduler
from datetime import datetime, timedelta

def job():
    print("一次性任務(wù)觸發(fā)")

scheduler = BlockingScheduler()

# 示例1:5秒后執(zhí)行
scheduler.add_job(job, 'date', 
                 run_date=datetime.now() + timedelta(seconds=5))

# 示例2:指定具體時(shí)間(2023-12-31 23:59:59)
scheduler.add_job(job, 'date', 
                 run_date='2023-12-31 23:59:59')

scheduler.start()

(2)interval 為固定時(shí)間間隔觸發(fā)。interval 間隔調(diào)度。

def job():
    print("間隔任務(wù)觸發(fā)")

# 每30分鐘執(zhí)行一次
scheduler.add_job(job, 'interval', 
                 minutes=30,
                 start_date='2023-08-15 09:00:00',
                 end_date='2023-08-20 18:00:00')

# weeks, days, hours, minutes, seconds
# start_date:首次觸發(fā)時(shí)間(默認(rèn)立即開始), end_date:停止觸發(fā)時(shí)間

# 每2小時(shí)15分鐘執(zhí)行一次(組合參數(shù))
scheduler.add_job(job, 'interval', 
                 hours=2, minutes=15)

(3)cron 在特定時(shí)間周期性地觸發(fā),和Linux crontab格式兼容。

def job():
    print("Cron任務(wù)觸發(fā)")

# 每天8:30執(zhí)行(傳統(tǒng)Cron風(fēng)格)
scheduler.add_job(job, 'cron', 
                 hour=8, minute=30)

# 每周一至周五的9:00和17:00執(zhí)行
scheduler.add_job(job, 'cron', 
                 day_of_week='mon-fri',
                 hour='9,17')

# 每15分鐘執(zhí)行一次(類似 interval)
scheduler.add_job(job, 'cron', 
                 minute='*/15')

# 每月最后一天23:59執(zhí)行
scheduler.add_job(job, 'cron', 
                 day='last', 
                 hour=23, minute=59)

3.3作業(yè)存儲(chǔ)器(Job Stores)

任務(wù)持久化倉(cāng)庫(kù),默認(rèn)保存任務(wù)在內(nèi)存中,也可將任務(wù)保存都各種數(shù)據(jù)庫(kù)中,任務(wù)中的數(shù)據(jù)序列化后保存到持久化數(shù)據(jù)庫(kù),從數(shù)據(jù)庫(kù)加載后又反序列化。

  • MemoryJobStore:默認(rèn)存儲(chǔ)器,所有作業(yè)保存在內(nèi)存中,程序終止后丟失。適用于臨時(shí)任務(wù)或測(cè)試環(huán)境。
  • SQLAlchemyJobStore:使用關(guān)系型數(shù)據(jù)庫(kù)(如SQLite、MySQL、PostgreSQL)持久化存儲(chǔ)。需指定數(shù)據(jù)庫(kù)URL。
  • MongoDBJobStore:將作業(yè)存儲(chǔ)在MongoDB中,需指定數(shù)據(jù)庫(kù)和集合名。依賴pymongo庫(kù)。
  • RedisJobStore:使用Redis存儲(chǔ)作業(yè),支持高效的鍵值存儲(chǔ)。依賴redis庫(kù)。
  • 自定義存儲(chǔ)器:通過(guò)繼承BaseJobStore實(shí)現(xiàn)自定義存儲(chǔ)邏輯(如文件系統(tǒng)、云存儲(chǔ))。
from apscheduler.schedulers.blocking import BlockingScheduler
from apscheduler.jobstores.sqlalchemy import SQLAlchemyJobStore
from apscheduler.jobstores.memory import MemoryJobStore

jobstores = {
    'default': SQLAlchemyJobStore(url='sqlite:///jobs.db'),
    'memory': MemoryJobStore()
}
scheduler = BlockingScheduler(jobstores=jobstores)

3.4 執(zhí)行器(Executors)

負(fù)責(zé)處理作業(yè)的運(yùn)行,提交指定的可調(diào)用對(duì)象到一個(gè)線程或進(jìn)程池完成作業(yè)。當(dāng)作業(yè)完成時(shí),執(zhí)行器將會(huì)通知調(diào)度器。

關(guān)鍵參數(shù):

1. max_workers:控制線程 / 進(jìn)程池的大小

2. misfire_grace_time:任務(wù)錯(cuò)過(guò)觸發(fā)后仍允許執(zhí)行的時(shí)間(秒)

3. coalesce:合并多次未執(zhí)行的任務(wù)。

ThreadPoolExecutor:使用線程池管理任務(wù)。

from apscheduler.executors.pool import ThreadPoolExecutor
executors = {
    'default': ThreadPoolExecutor(max_workers=5)  # 最大線程數(shù)
}

ThreadPoolExecutor:使用線程池管理任務(wù)。

from apscheduler.executors.pool import ProcessPoolExecutor
executors = {
    'default': ProcessPoolExecutor(max_workers=3)  # 最大進(jìn)程數(shù)
}

 AsyncIOExecutor:基于 asyncio 的異步執(zhí)行。

from apscheduler.executors.asyncio import AsyncIOExecutor
executors = {
    'default': AsyncIOExecutor()
}

以上就是一文詳解Python中的日期計(jì)算和自動(dòng)化運(yùn)行腳本的詳細(xì)內(nèi)容,更多關(guān)于Python日期計(jì)算的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 一篇文章帶你了解Python之Selenium自動(dòng)化爬蟲

    一篇文章帶你了解Python之Selenium自動(dòng)化爬蟲

    這篇文章主要為大家詳細(xì)介紹了Python之Selenium自動(dòng)化爬蟲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-01-01
  • 用Python畫一個(gè)LinkinPark的logo代碼實(shí)例

    用Python畫一個(gè)LinkinPark的logo代碼實(shí)例

    這篇文章主要介紹了用Python畫一個(gè)LinkinPark的logo代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-09-09
  • 如何利用Python隨機(jī)從list中挑選一個(gè)元素

    如何利用Python隨機(jī)從list中挑選一個(gè)元素

    這篇文章主要介紹了如何利用Python隨機(jī)從list中挑選一個(gè)元素,文章通過(guò)研究從列表中選擇隨機(jī)元素的不同實(shí)現(xiàn)方法展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-05-05
  • Python腳本實(shí)現(xiàn)自動(dòng)化管理Windows域

    Python腳本實(shí)現(xiàn)自動(dòng)化管理Windows域

    這篇文章主要為大家詳細(xì)介紹了如何通過(guò)Python 的 ldap3 和 PowerShell 實(shí)現(xiàn)域用戶批量管理,組策略自動(dòng)推送等操作,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解下
    2026-05-05
  • 簡(jiǎn)單實(shí)現(xiàn)python聊天程序

    簡(jiǎn)單實(shí)現(xiàn)python聊天程序

    這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)簡(jiǎn)單聊天程序的相關(guān)代碼,包括客戶端和服務(wù)端,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-04-04
  • Django通過(guò)json格式收集主機(jī)信息

    Django通過(guò)json格式收集主機(jī)信息

    這篇文章主要介紹了基于Django收集主機(jī)信息json格式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-05-05
  • 基于Django靜態(tài)資源部署404的解決方法

    基于Django靜態(tài)資源部署404的解決方法

    今天小編就為大家分享一篇基于Django靜態(tài)資源部署404的解決方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-07-07
  • python實(shí)現(xiàn)刪除列表中某個(gè)元素的3種方法

    python實(shí)現(xiàn)刪除列表中某個(gè)元素的3種方法

    這篇文章主要介紹了python實(shí)現(xiàn)刪除列表中某個(gè)元素的3種方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01
  • Python 多線程,threading模塊,創(chuàng)建子線程的兩種方式示例

    Python 多線程,threading模塊,創(chuàng)建子線程的兩種方式示例

    這篇文章主要介紹了Python 多線程,threading模塊,創(chuàng)建子線程的兩種方式,結(jié)合實(shí)例形式分析了Python線程的原理與創(chuàng)建子線程的相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2019-09-09
  • 如何修改Jupyter工作路徑(已安裝Anaconda)

    如何修改Jupyter工作路徑(已安裝Anaconda)

    這篇文章主要介紹了如何修改Jupyter工作路徑問(wèn)題(已安裝Anaconda),具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-08-08

最新評(píng)論

新源县| 郑州市| 东源县| 两当县| 库伦旗| 云龙县| 赤水市| 葵青区| 监利县| 广安市| 丹寨县| 杭州市| 宁阳县| 沅陵县| 尉氏县| 赤水市| 古浪县| 彰武县| 南靖县| 招远市| 东平县| 汝州市| 夹江县| 山东省| 崇阳县| 冷水江市| 二手房| 左权县| 泽州县| 林芝县| 万州区| 永春县| 南京市| 沾益县| 深圳市| 通道| 泰安市| 新营市| 商丘市| 米林县| 健康|