package schedule import ( "time" ) // TimeLineSrv 绝对时间线段 type TimeLineSrv struct { StartTime time.Time // 时间曲线的起始时间点 EndTime time.Time // 时间曲线的结束时间点 Duration time.Duration EffFactor float64 // 效率因子 WorkShiftNr int // 人员班组编号 } // Init 初始化,获取时间差值 = (结束时间 - 开始时间) * 效率因子 func (tlsrv *TimeLineSrv) Init() { var seconds float64 if tlsrv.EffFactor <= 0 { tlsrv.EffFactor = 1.0 } if tlsrv.StartTime.Unix() > tlsrv.EndTime.Unix() { tlsrv.Duration = 0 } else { seconds = tlsrv.EndTime.Sub(tlsrv.StartTime).Seconds() * tlsrv.EffFactor tlsrv.Duration = time.Duration(seconds) * time.Second } } // GetDuration 获取时间线的Duration,不考虑效率因子 func (tlsrv *TimeLineSrv) GetDuration() (duration time.Duration) { if tlsrv.StartTime.Unix() > tlsrv.EndTime.Unix() { duration = 0 return } else { duration = tlsrv.EndTime.Sub(tlsrv.StartTime) return } } // GetEffDuration 获取时间线的Duration,考虑效率因子 func (tlsrv *TimeLineSrv) GetEffDuration() (effDuration time.Duration) { var seconds float64 if tlsrv.StartTime.Unix() > tlsrv.EndTime.Unix() { effDuration = 0 return } else { if tlsrv.EffFactor <= 0 { tlsrv.EffFactor = 1.0 } seconds = tlsrv.EndTime.Sub(tlsrv.StartTime).Seconds() * tlsrv.EffFactor effDuration = time.Duration(seconds) * time.Second return } } // GetEndTimeByDuration 基于线段的起始时间和持续时间计算在该线段上的结束时间 func (tlsrv *TimeLineSrv) GetEndTimeByDuration(duration time.Duration) (endTime time.Time) { var seconds float64 if tlsrv.Duration <= duration { endTime = tlsrv.EndTime return } else { if tlsrv.EffFactor <= 0 { tlsrv.EffFactor = 1.0 } seconds = duration.Seconds() / tlsrv.EffFactor endTime = tlsrv.EndTime.Add(-time.Duration(seconds) * time.Second) return } return } // GetDurationByStartTime 基于落在线段内的起始时间计算到线段结束的Duration func (tlsrv *TimeLineSrv) GetDurationByStartTime(startTime time.Time) (duration time.Duration) { var seconds float64 if startTime.Unix() >= tlsrv.EndTime.Unix() { duration = 0 return } if startTime.Unix() < tlsrv.StartTime.Unix() { duration = tlsrv.Duration return } seconds = tlsrv.EndTime.Sub(startTime).Seconds() * tlsrv.EffFactor duration = time.Duration(seconds) * time.Second return } // GetDurationByEndTime 基于落在线段的起始时间计算到指定结束时间的Duration func (tlsrv *TimeLineSrv) GetDurationByEndTime(endTime time.Time) (duration time.Duration) { var seconds float64 if endTime.Unix() <= tlsrv.StartTime.Unix() { duration = 0 return } if endTime.Unix() >= tlsrv.EndTime.Unix() { duration = tlsrv.Duration return } seconds = endTime.Sub(tlsrv.StartTime).Seconds() * tlsrv.EffFactor duration = time.Duration(seconds) * time.Second return } // GetDurationByStartEndTime 获取线段上两个时间点之间的Duration func (tlsrv *TimeLineSrv) GetDurationByStartEndTime(startTime, endTime time.Time) (duration time.Duration) { var seconds float64 if startTime.Unix() < tlsrv.StartTime.Unix() { startTime = tlsrv.StartTime } if endTime.Unix() > tlsrv.EndTime.Unix() { endTime = tlsrv.EndTime } if endTime.Unix() <= startTime.Unix() { duration = 0 return } seconds = endTime.Sub(startTime).Seconds() * tlsrv.EffFactor duration = time.Duration(seconds) * time.Second return }