Golang如何设置cron定时任务在下午6点执行

Golang如何设置cron定时任务在下午6点执行 我使用“github.com/robfig/cron”并设置 c.AddFunc(“0 18 * * ?”, taskList),希望它每天下午6点运行,但实际上它每小时都在运行

c.AddFunc("0 18 * * ?", taskList)
4 回复

我应该这样做吗 0 0 18 * * ?

更多关于Golang如何设置cron定时任务在下午6点执行的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


你好。0代表秒数,18代表分钟数,所以你设置的是在每个整点过18分钟时运行。

0 0 18 * * (后三个字段分别表示月份中的日期、月份和星期几)在文档中:问号可用于替代’’,以便将月份中的日期或星期几留空,因此0 0 18 * * ?也是有效的。

您遇到的问题是由于cron表达式格式不正确导致的。github.com/robfig/cron库默认使用标准的Unix cron格式,而不是您使用的Quartz格式。

问题分析

您的表达式 "0 18 * * ?" 中的问号在标准cron格式中不是有效字符,这导致解析异常,可能触发了默认的每小时执行行为。

正确的解决方案

使用标准的cron格式:

package main

import (
    "fmt"
    "log"
    "time"
    
    "github.com/robfig/cron/v3"
)

func taskList() {
    fmt.Printf("任务执行于: %s\n", time.Now().Format("2006-01-02 15:04:05"))
}

func main() {
    c := cron.New()
    
    // 正确的cron表达式 - 每天18:00执行
    _, err := c.AddFunc("0 18 * * *", taskList)
    if err != nil {
        log.Fatal("添加定时任务失败:", err)
    }
    
    c.Start()
    
    // 保持程序运行
    select {}
}

其他常用的时间表达式示例

// 每天下午6点执行
c.AddFunc("0 18 * * *", taskList)

// 每天下午6点30分执行
c.AddFunc("30 18 * * *", taskList)

// 每小时的0分执行(每小时一次)
c.AddFunc("0 * * * *", taskList)

// 每周一18:00执行
c.AddFunc("0 18 * * 1", taskList)

// 每5分钟执行一次
c.AddFunc("*/5 * * * *", taskList)

使用v3版本的推荐方式

建议使用v3版本,它提供了更好的错误处理和更多功能:

package main

import (
    "fmt"
    "log"
    "time"
    
    "github.com/robfig/cron/v3"
)

func main() {
    c := cron.New(cron.WithSeconds()) // 可选:支持秒级精度
    
    // 添加任务
    _, err := c.AddFunc("0 18 * * *", func() {
        fmt.Printf("定时任务执行: %s\n", time.Now().Format("2006-01-02 15:04:05"))
    })
    
    if err != nil {
        log.Fatal("定时任务配置错误:", err)
    }
    
    c.Start()
    defer c.Stop()
    
    // 程序持续运行
    select {}
}

关键点是使用标准的cron表达式格式 "0 18 * * *" 来确保任务在每天下午6点正确执行。

回到顶部