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 分钟前
Spring Boot 2.6+版本为什么默认禁止循环引用?
后端
数据库那些事儿16 分钟前
Qoder + ADB Supabase :5分钟GET超火AI手办生图APP
数据库·后端
用户685453759776918 分钟前
从"打电话"到"装修智能家居":让你的AI从话痨变成行动派!
后端
用户89535603282201 小时前
深入浅出 Go slices 包:类型安全、内存安全与高性能实践
go
Java水解1 小时前
Spring JDBC与KingbaseES深度集成:构建高性能国产数据库应用实战
后端·spring
Giant1001 小时前
小白也能懂的 Token 认证:从原理到实战,用 Express 手把手教你做
后端
间彧2 小时前
Spring IoC容器解决循环依赖的三级缓存机制详解
后端
间彧2 小时前
Spring IoC详解与应用实战
后端
junnhwan2 小时前
【苍穹外卖笔记】Day04--套餐管理模块
java·数据库·spring boot·后端·苍穹外卖·crud
间彧2 小时前
Java NPE异常详解
后端