1 Star 0 Fork 0

yangwood/novacore

加入 Gitee
与超过 1400万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
timeSchedule.go 1.77 KB
一键复制 编辑 原始数据 按行查看 历史
yangwood 提交于 2025-04-16 20:15 +08:00 . time cron tab
package tools
import "time"
// scheduleWeekly 启动一个周期性任务,每周特定时间执行
func ScheduleWeekly(targetWeekday time.Weekday, targetHour, targetMinute int, task func()) {
go func() {
for {
next := nextTriggerTime(targetWeekday, targetHour, targetMinute)
timer := time.NewTimer(time.Until(next))
<-timer.C
task()
}
}()
}
// nextTriggerTime 计算下一个触发时间点
func nextTriggerTime(targetWeekday time.Weekday, targetHour, targetMinute int) time.Time {
now := time.Now()
// 构造当前日期的目标时间(时分秒归零)
t := time.Date(now.Year(), now.Month(), now.Day(), targetHour, targetMinute, 0, 0, now.Location())
// 计算到目标星期所需的天数
daysToAdd := (int(targetWeekday) - int(t.Weekday()) + 7) % 7
if daysToAdd == 0 {
// 今天已是目标星期,检查是否已过目标时间
if now.After(t) {
daysToAdd = 7 // 已过时间,延至下周
}
}
t = t.AddDate(0, 0, daysToAdd)
// 处理跨月/年后时间仍早于当前时间的情况(罕见情况)
if t.Before(now) {
t = t.AddDate(0, 0, 7)
}
return t
}
// ScheduleDaily 启动每日定时任务
func ScheduleDaily(targetHour, targetMinute, targetSecond int, task func()) {
go func() {
for {
next := nextDailyTriggerTime(targetHour, targetMinute, targetSecond)
timer := time.NewTimer(time.Until(next))
<-timer.C
task()
}
}()
}
// nextDailyTriggerTime 计算下个触发时间点(精确到秒)
func nextDailyTriggerTime(h, m, s int) time.Time {
now := time.Now()
// 构造今日目标时间
today := time.Date(now.Year(), now.Month(), now.Day(), h, m, s, 0, now.Location())
// 若当前时间已过今日目标时间,则设置为明日
if now.After(today) {
return today.Add(24 * time.Hour)
}
return today
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
Go
1
https://gitee.com/yangwood/novacore.git
git@gitee.com:yangwood/novacore.git
yangwood
novacore
novacore
v1.2.92

搜索帮助