golang----定时任务

  1. time.Date 构造出下一次任务执行的时间 next
  2. now.After(next) 判断 next 时间是否已经过去了,如果 true,已经过去了,则往后推一个循环,如果是每天的定时任务,则后推一天
  3. next.Sub(now) 计算下一次任务将在多少秒后执行
  4. 使用 time.NewTicker(duration) 构造一个定时器
  5. for 循环触发定时器,每次触发后再度初始化定时器
go 复制代码
package main

import (
    "fmt"
    "time"
)

func main() {
    // 每天的3点执行
    hour := 3
    minute := 0
    second := 0
    now := time.Now()
    // 计算下一个3点时刻
    next := time.Date(now.Year(), now.Month(), now.Day(), hour, minute, second, 0, now.Location())
    if now.After(next) {
       next = next.Add(24 * time.Hour)
    }
    duration := next.Sub(now)
    fmt.Printf("下一次任务将在 %s 秒后执行", duration)
    timer := time.NewTicker(duration)
    defer timer.Stop()
    // 定时调用
    for {
       select {
       case <-timer.C:
          fmt.Println("执行定时任务")
          // 重新计算下一个3点时刻
          now := time.Now()
          next := time.Date(now.Year(), now.Month(), now.Day(), hour, minute, second, 0, now.Location())
          next = next.Add(24 * time.Hour)
          duration = next.Sub(now)
          timer.Stop()
          timer = time.NewTicker(duration)
          fmt.Printf("下一次任务将在 %s 秒后执行", duration)
       }
    }
}
相关推荐
想打游戏的程序猿4 小时前
核心概念层——深入理解 Agent 是什么
后端·ai编程
woniu_maggie5 小时前
SAP Web Service日志监控:如何用SRT_UTIL快速定位接口问题
后端
一线大码5 小时前
Java 使用国密算法实现数据加密传输
java·spring boot·后端
Rust语言中文社区5 小时前
【Rust日报】用 Rust 重写的 Turso 是一个更好的 SQLite 吗?
开发语言·数据库·后端·rust·sqlite
在屏幕前出油6 小时前
06. FastAPI——中间件
后端·python·中间件·pycharm·fastapi
wuqingshun3141597 小时前
说一下spring的bean的作用域
java·后端·spring
不会写DN7 小时前
GORM 实战入门:从环境搭建到企业级常用特性全解析
sql·mysql·go·gin
钟智强8 小时前
从2.7GB到481MB:我的Docker Compose优化实战,以及为什么不能全信AI
后端·docker
华科易迅8 小时前
Spring JDBC
java·后端·spring
小村儿9 小时前
一起吃透 Claude Code,告别 AI 编程迷茫
前端·后端·ai编程