You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

87 lines
2.1 KiB

  1. package ztimer
  2. /**
  3. * @Author: Aceld
  4. * @Date: 2019/4/30 17:42
  5. * @Mail: danbing.at@gmail.com
  6. */
  7. import (
  8. "time"
  9. )
  10. const (
  11. //HourName 小时
  12. HourName = "HOUR"
  13. //HourInterval 小时间隔ms为精度
  14. HourInterval = 60 * 60 * 1e3
  15. //HourScales 12小时制
  16. HourScales = 12
  17. //MinuteName 分钟
  18. MinuteName = "MINUTE"
  19. //MinuteInterval 每分钟时间间隔
  20. MinuteInterval = 60 * 1e3
  21. //MinuteScales 60分钟
  22. MinuteScales = 60
  23. //SecondName 秒
  24. SecondName = "SECOND"
  25. //SecondInterval 秒的间隔
  26. SecondInterval = 1e3
  27. //SecondScales 60秒
  28. SecondScales = 60
  29. //TimersMaxCap //每个时间轮刻度挂载定时器的最大个数
  30. TimersMaxCap = 2048
  31. )
  32. /*
  33. 注意
  34. 有关时间的几个换算
  35. time.Second() = time.Millisecond * 1e3
  36. time.Millisecond(毫秒) = time.Microsecond * 1e3
  37. time.Microsecond(微秒) = time.Nanosecond * 1e3
  38. time.Now().UnixNano() ==> time.Nanosecond (纳秒)
  39. */
  40. //Timer 定时器实现
  41. type Timer struct {
  42. //延迟调用函数
  43. delayFunc *DelayFunc
  44. //调用时间(unix 时间, 单位ms)
  45. unixts int64
  46. }
  47. //UnixMilli 返回1970-1-1至今经历的毫秒数
  48. func UnixMilli() int64 {
  49. return time.Now().UnixNano() / 1e6
  50. }
  51. //NewTimerAt 创建一个定时器,在指定的时间触发 定时器方法 df: DelayFunc类型的延迟调用函数类型;unixNano: unix计算机从1970-1-1至今经历的纳秒数
  52. func NewTimerAt(df *DelayFunc, unixNano int64) *Timer {
  53. return &Timer{
  54. delayFunc: df,
  55. unixts: unixNano / 1e6, //将纳秒转换成对应的毫秒 ms ,定时器以ms为最小精度
  56. }
  57. }
  58. //NewTimerAfter 创建一个定时器,在当前时间延迟duration之后触发 定时器方法
  59. func NewTimerAfter(df *DelayFunc, duration time.Duration) *Timer {
  60. return NewTimerAt(df, time.Now().UnixNano()+int64(duration))
  61. }
  62. //Run 启动定时器,用一个go承载
  63. func (t *Timer) Run() {
  64. go func() {
  65. now := UnixMilli()
  66. //设置的定时器是否在当前时间之后
  67. if t.unixts > now {
  68. //睡眠,直至时间超时,已微秒为单位进行睡眠
  69. time.Sleep(time.Duration(t.unixts-now) * time.Millisecond)
  70. }
  71. //调用事先注册好的超时延迟方法
  72. t.delayFunc.Call()
  73. }()
  74. }