gitee.com/zhongguo168a/gocodes@v0.0.0-20230609140523-e1828349603f/myx/slowtime/整点执行.go (about)

     1  package slowtime
     2  
     3  import (
     4  	"time"
     5  )
     6  
     7  func M每X毫秒整点(每X毫秒 int, handler func(), afterHandler func(difTime time.Duration)) {
     8  
     9  	time.Sleep(time.Duration(计算误差时间(time.Now(), int64(每X毫秒))))
    10  	//fmt.Println("M每毫秒整点", time.Now().Format("2006-01-02 15:04:05.999999999"))
    11  	for {
    12  		prevTime := time.Now()
    13  		if handler != nil {
    14  			handler()
    15  		}
    16  		afterTime := time.Now()
    17  		if afterHandler != nil {
    18  			afterHandler(afterTime.Sub(prevTime))
    19  		}
    20  		time.Sleep(time.Duration(计算误差时间(afterTime, int64(每X毫秒))))
    21  		//fmt.Println("M每毫秒整点", time.Now().Format("2006-01-02 15:04:05.999"))
    22  	}
    23  }
    24  
    25  func 计算误差时间(now time.Time, 每X毫秒 int64) int {
    26  	dif := now.UnixNano() - (now.UnixMilli()/每X毫秒)*int64(time.Millisecond)*每X毫秒
    27  	sleepTime := int64(time.Millisecond)*每X毫秒 - dif
    28  	if sleepTime < 0 {
    29  		sleepTime = 0
    30  	}
    31  	return int(sleepTime)
    32  }