golang根据配置的时间和时区计算定时任务是否到了刷新时间
2016-11-04 21:16
706 查看
起因
思路
细化
遗留问题
然而,中国的12点和越南的12点就不是同一个12点,所以需要通过时区计算是否到了该执行任务的时候。
由于西3时区比格林威治时间慢3个小时,等西3时区20点的时候,格林威治时间就是20点再过3小时,对应的格林威治时间就是
而如果是东8时区到20点的时候,格林威治时间还差8小时才到20点,则对应的时间是
定义了定时任务执行的时分秒,offset表示在格林威治时间对应的时分秒基础上做多少偏移能得到本地的目标时间。offset定义如下
E8对应东8区,W3对应西3区,参照前文的计算方式。
通过一下代码计算是否达到(或者超过了)当地的执行时间
定时任务执行以后,需要把lastRefreshTime设置为当前时间。
完整内容查看github上的代码
思路
细化
遗留问题
起因
很多时候我们会碰到这样的需求,每天某个时候需要定时执行某个任务,比如定时发邮件、定时发推送消息等,而这个定时是针对当地时间的,比如每天中午12点发推送消息给玩家提醒可以上线领金币啦。然而,中国的12点和越南的12点就不是同一个12点,所以需要通过时区计算是否到了该执行任务的时候。
思路
先来看一下如何根据时区计算约定的时间。假设现在需要晚上20点,执行任务,时区为西3时区。首先生成一个格林威治时间的20点utcTime := time.Now().UTC() targetTime :=time.Date(utcTime.Year(),utcTime.Month(),utcTime.Day(), 20, 0, 0, 0, utcTime.Location())
由于西3时区比格林威治时间慢3个小时,等西3时区20点的时候,格林威治时间就是20点再过3小时,对应的格林威治时间就是
targetTime.Unix() + 3 * 3600
而如果是东8时区到20点的时候,格林威治时间还差8小时才到20点,则对应的时间是
targetTime.Unix() - 8 * 3600
细化
先对刷新时间的配置定义一个结构type RefreshConfig struct { TargetHour int TargetMinute int Targetsecond int Offset int64 lastRefreshTime int64 }
定义了定时任务执行的时分秒,offset表示在格林威治时间对应的时分秒基础上做多少偏移能得到本地的目标时间。offset定义如下
var zoneToOffset = map[string]int64{ "Z0": 0, "E1": -1 * 3600, "E2": -2 * 3600, "E3": -3 * 3600, "E4": -4 * 3600, "E5": -5 * 3600, "E6": -6 * 3600, "E7": -7 * 3600, "E8": -8 * 3600, "E9": -9 * 3600, "E10": -10 * 3600, "E11": -11 * 3600, "E12": 12 * 3600, "W1": 1 * 3600, "W2": 2 * 3600, "W3": 3 * 3600, "W4": 4 * 3600, "W5": 5 * 3600, "W6": 6 * 3600, "W7": 7 * 3600, "W8": 8 * 3600, "W9": 9 * 3600, "W10": 10 * 3600, "W11": 11 * 3600, "W12": 12 * 3600, }
E8对应东8区,W3对应西3区,参照前文的计算方式。
通过一下代码计算是否达到(或者超过了)当地的执行时间
func TimeIsUp(refreshConfig *RefreshConfig) bool { targetTime := getTargerTime(refreshConfig.TargetHour, refreshConfig.TargetMinute, refreshConfig.Targetsecond, refreshConfig.Offset) return refreshConfig.lastRefreshTime < targetTime && time.Now().Unix() >= targetTime }
定时任务执行以后,需要把lastRefreshTime设置为当前时间。
完整内容查看github上的代码
遗留问题
对于夏令时的计算,暂时没找到比较好的办法。相关文章推荐
- quartz定时任务时间配置以及事例
- 定时任务(从配置文件中读时间)
- Spring 定时任务(精)(session工具类(配置失效时间),cookie工具类 web工程(初始化容器) redis工具类)
- 生成二维码 加密解密类 TABLE转换成实体、TABLE转换成实体集合(可转换成对象和值类型) COOKIE帮助类 数据类型转换 截取字符串 根据IP获取地点 生成随机字符 UNIX时间转换为DATETIME\DATETIME转换为UNIXTIME 是否包含中文 生成秘钥方式之一 计算某一年 某一周 的起始时间和结束时间
- spring-task定时任务动态配置修改执行时间
- spring定时任务--多个任务和执行时间间隔配置
- 使用spring@Schedule注解定时任务时将时间表达式写入配置文件中的方法
- C#源码刷新网页 最小化托盘http get和post请求配置保存版权时间限制定时调用 单实例运行,如果已经运行则激活窗口到最前显示
- EOS Platform7.5配置了固定时刻触发的定时任务,没有准确的按照配置的间隔时间触发
- Spring 配置quartz定时任务及时间设置
- Quartz 定时任务 时间配置
- cron表达式详解(spring定时任务时间间隔配置)
- 《时间同步介绍及实战配置——介绍定时任务及简单配置》
- golang 定时刷新配置文件
- spring定时任务 (二) 多个任务和执行时间间隔配置
- quartz定时任务时间配置
- Spring 定时任务配置以及用法,定时任务时间表达式
- SpringMVC整合Quartz实现定时任务和Crontrigger时间配置和版本问题
- 定时任务的时间格式配置
- java 定时器,固定某个时间执行(Spring+Quartz实现定时任务的配置方法)