bug fix
This commit is contained in:
parent
441b552380
commit
a8f7de6042
59
timer.go
59
timer.go
@ -2,6 +2,7 @@ package startimer
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
"encoding/json"
|
||||||
"errors"
|
"errors"
|
||||||
"sort"
|
"sort"
|
||||||
"sync"
|
"sync"
|
||||||
@ -96,6 +97,40 @@ func (t *StarTimer) NextTimer() time.Time {
|
|||||||
return t.nextDate
|
return t.nextDate
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (t *StarTimer) NextTimerAfterDate(date time.Time) time.Time {
|
||||||
|
return t.parseNextDate(date, true)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *StarTimer) ExportRepeats() (string, error) {
|
||||||
|
var rep []Repeats
|
||||||
|
for _, r := range t.repeat {
|
||||||
|
rep = append(rep, *r)
|
||||||
|
}
|
||||||
|
data, err := json.Marshal(rep)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
return string(data), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *StarTimer) ImportRepeats(r string) error {
|
||||||
|
t.mu.Lock()
|
||||||
|
defer t.mu.Unlock()
|
||||||
|
if t.running {
|
||||||
|
return errors.New("coonot import repeats to already running timer")
|
||||||
|
}
|
||||||
|
var rep []Repeats
|
||||||
|
err := json.Unmarshal([]byte(r), &rep)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
t.repeat = make([]*Repeats, 0, len(rep))
|
||||||
|
for _, v := range rep {
|
||||||
|
t.repeat = append(t.repeat, &v)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func (t *StarTimer) BaseDate() time.Time {
|
func (t *StarTimer) BaseDate() time.Time {
|
||||||
return t.base
|
return t.base
|
||||||
}
|
}
|
||||||
@ -113,7 +148,7 @@ func (t *StarTimer) Run() error {
|
|||||||
if t.running {
|
if t.running {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
t.nextDate = t.parseNextDate(t.base)
|
t.nextDate = t.parseNextDate(time.Now(), false)
|
||||||
if t.nextDate.Before(time.Now()) {
|
if t.nextDate.Before(time.Now()) {
|
||||||
return errors.New("Invalid Timer Options,Please Check")
|
return errors.New("Invalid Timer Options,Please Check")
|
||||||
}
|
}
|
||||||
@ -127,7 +162,7 @@ func (t *StarTimer) Run() error {
|
|||||||
t.mu.Unlock()
|
t.mu.Unlock()
|
||||||
select {
|
select {
|
||||||
case <-t.timer.C:
|
case <-t.timer.C:
|
||||||
t.nextDate = t.parseNextDate(t.nextDate)
|
t.nextDate = t.parseNextDate(t.nextDate, false)
|
||||||
if t.nextDate.Before(now) {
|
if t.nextDate.Before(now) {
|
||||||
t.Stop()
|
t.Stop()
|
||||||
}
|
}
|
||||||
@ -145,7 +180,7 @@ func (t *StarTimer) Run() error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *StarTimer) parseNextDate(base time.Time) time.Time {
|
func (t *StarTimer) parseNextDate(base time.Time, isMock bool) time.Time {
|
||||||
if len(t.repeat) == 0 {
|
if len(t.repeat) == 0 {
|
||||||
return time.Time{}
|
return time.Time{}
|
||||||
}
|
}
|
||||||
@ -155,7 +190,7 @@ func (t *StarTimer) parseNextDate(base time.Time) time.Time {
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if d.Every {
|
if d.Every {
|
||||||
dates = append(dates, t.parseEveryNextDate(base, d)...)
|
dates = append(dates, t.parseEveryNextDate(base, d, isMock)...)
|
||||||
} else {
|
} else {
|
||||||
dates = append(dates, t.parseStaticNextDate(base, d))
|
dates = append(dates, t.parseStaticNextDate(base, d))
|
||||||
}
|
}
|
||||||
@ -226,14 +261,16 @@ func (t *StarTimer) parseStaticNextDate(base time.Time, r *Repeats) time.Time {
|
|||||||
return target
|
return target
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *StarTimer) parseEveryNextDate(target time.Time, r *Repeats) []time.Time {
|
func (t *StarTimer) parseEveryNextDate(target time.Time, r *Repeats, isMock bool) []time.Time {
|
||||||
var res []time.Time
|
var res []time.Time
|
||||||
if r.Every { //定期日期
|
if r.Every { //定期日期
|
||||||
for idx, d := range r.Repeat {
|
for idx, d := range r.Repeat {
|
||||||
if d.baseDate.Unix() == -62135596800 {
|
if d.baseDate.Unix() == -62135596800 {
|
||||||
d.baseDate = t.base
|
d.baseDate = t.base
|
||||||
|
if !isMock {
|
||||||
r.Repeat[idx] = d
|
r.Repeat[idx] = d
|
||||||
}
|
}
|
||||||
|
}
|
||||||
if d.baseDate.After(target) {
|
if d.baseDate.After(target) {
|
||||||
res = append(res, d.baseDate)
|
res = append(res, d.baseDate)
|
||||||
continue
|
continue
|
||||||
@ -243,7 +280,9 @@ func (t *StarTimer) parseEveryNextDate(target time.Time, r *Repeats) []time.Time
|
|||||||
for {
|
for {
|
||||||
d.baseDate = d.baseDate.Add(time.Second * time.Duration(int(d.Value)))
|
d.baseDate = d.baseDate.Add(time.Second * time.Duration(int(d.Value)))
|
||||||
if d.baseDate.After(target) {
|
if d.baseDate.After(target) {
|
||||||
|
if !isMock {
|
||||||
r.Repeat[idx] = d
|
r.Repeat[idx] = d
|
||||||
|
}
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -252,7 +291,9 @@ func (t *StarTimer) parseEveryNextDate(target time.Time, r *Repeats) []time.Time
|
|||||||
for {
|
for {
|
||||||
d.baseDate = d.baseDate.Add(time.Minute * time.Duration(int(d.Value)))
|
d.baseDate = d.baseDate.Add(time.Minute * time.Duration(int(d.Value)))
|
||||||
if d.baseDate.After(target) {
|
if d.baseDate.After(target) {
|
||||||
|
if !isMock {
|
||||||
r.Repeat[idx] = d
|
r.Repeat[idx] = d
|
||||||
|
}
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -261,7 +302,9 @@ func (t *StarTimer) parseEveryNextDate(target time.Time, r *Repeats) []time.Time
|
|||||||
for {
|
for {
|
||||||
d.baseDate = d.baseDate.Add(time.Hour * time.Duration(int(d.Value)))
|
d.baseDate = d.baseDate.Add(time.Hour * time.Duration(int(d.Value)))
|
||||||
if d.baseDate.After(target) {
|
if d.baseDate.After(target) {
|
||||||
|
if !isMock {
|
||||||
r.Repeat[idx] = d
|
r.Repeat[idx] = d
|
||||||
|
}
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -270,7 +313,9 @@ func (t *StarTimer) parseEveryNextDate(target time.Time, r *Repeats) []time.Time
|
|||||||
for {
|
for {
|
||||||
d.baseDate = d.baseDate.Add(time.Hour * 24 * time.Duration(int(d.Value)))
|
d.baseDate = d.baseDate.Add(time.Hour * 24 * time.Duration(int(d.Value)))
|
||||||
if d.baseDate.After(target) {
|
if d.baseDate.After(target) {
|
||||||
|
if !isMock {
|
||||||
r.Repeat[idx] = d
|
r.Repeat[idx] = d
|
||||||
|
}
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -279,7 +324,9 @@ func (t *StarTimer) parseEveryNextDate(target time.Time, r *Repeats) []time.Time
|
|||||||
for {
|
for {
|
||||||
d.baseDate = d.baseDate.AddDate(0, int(d.Value), 0)
|
d.baseDate = d.baseDate.AddDate(0, int(d.Value), 0)
|
||||||
if d.baseDate.After(target) {
|
if d.baseDate.After(target) {
|
||||||
|
if !isMock {
|
||||||
r.Repeat[idx] = d
|
r.Repeat[idx] = d
|
||||||
|
}
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -288,7 +335,9 @@ func (t *StarTimer) parseEveryNextDate(target time.Time, r *Repeats) []time.Time
|
|||||||
for {
|
for {
|
||||||
d.baseDate = d.baseDate.AddDate(int(d.Value), 0, 0)
|
d.baseDate = d.baseDate.AddDate(int(d.Value), 0, 0)
|
||||||
if d.baseDate.After(target) {
|
if d.baseDate.After(target) {
|
||||||
|
if !isMock {
|
||||||
r.Repeat[idx] = d
|
r.Repeat[idx] = d
|
||||||
|
}
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
8
typed.go
8
typed.go
@ -18,14 +18,14 @@ const (
|
|||||||
)
|
)
|
||||||
|
|
||||||
type Repeats struct {
|
type Repeats struct {
|
||||||
Repeat []Repeat
|
Repeat []Repeat `json:"repeat"`
|
||||||
Every bool // false=static true=every
|
Every bool `json:"every"` // false=static true=every
|
||||||
}
|
}
|
||||||
|
|
||||||
type Repeat struct {
|
type Repeat struct {
|
||||||
Unit Unit
|
Unit Unit `json:"unit"`
|
||||||
baseDate time.Time
|
baseDate time.Time
|
||||||
Value uint32
|
Value uint32 `json:"value"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type StarTimer struct {
|
type StarTimer struct {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user