Skip to content

Commit 2781e61

Browse files
authored
Merge pull request #12 from reugn/develop
Fix bug in day-of-week cron expression (#11)
2 parents e6c6de5 + 06bfe99 commit 2781e61

File tree

2 files changed

+42
-1
lines changed

2 files changed

+42
-1
lines changed

quartz/cron.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -404,6 +404,10 @@ func (parser *CronExpressionParser) nextDay(prevWeek int, weekField *CronField,
404404
nextWeek, bumpDayOfMonth := parser.findNextValue(prevWeek, weekField.values)
405405
parser.setDone(dayOfWeekIndex)
406406
var _step int
407+
if len(weekField.values) == 1 && weekField.values[0] < prevWeek {
408+
bumpDayOfMonth = false
409+
}
410+
407411
if bumpDayOfMonth && len(weekField.values) == 1 {
408412
_step = 7
409413
} else {

quartz/cron_test.go

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package quartz_test
22

33
import (
4+
"fmt"
5+
"strconv"
46
"testing"
57
"time"
68

@@ -88,6 +90,41 @@ func TestCronExpression7(t *testing.T) {
8890
assertEqual(t, result, "Tue Jul 16 16:09:00 2019")
8991
}
9092

93+
func TestCronDaysOfWeek(t *testing.T) {
94+
daysOfWeek := []string{"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"}
95+
expected := []string{
96+
"Sun Apr 21 00:00:00 2019",
97+
"Mon Apr 22 00:00:00 2019",
98+
"Tue Apr 23 00:00:00 2019",
99+
"Wed Apr 24 00:00:00 2019",
100+
"Thu Apr 18 00:00:00 2019",
101+
"Fri Apr 19 00:00:00 2019",
102+
"Sat Apr 20 00:00:00 2019",
103+
}
104+
105+
for i := 0; i < len(daysOfWeek); i++ {
106+
cronDayOfWeek(t, daysOfWeek[i], expected[i])
107+
cronDayOfWeek(t, strconv.Itoa(i), expected[i])
108+
}
109+
}
110+
111+
func cronDayOfWeek(t *testing.T, dayOfWeek, expected string) {
112+
prev := int64(1555524000000000000) // Wed Apr 17 18:00:00 2019
113+
expression := fmt.Sprintf("0 0 0 * * %s", dayOfWeek)
114+
cronTrigger, err := quartz.NewCronTrigger(expression)
115+
if err != nil {
116+
t.Fatal(err)
117+
} else {
118+
nextFireTime, err := cronTrigger.NextFireTime(prev)
119+
if err != nil {
120+
t.Fatal(err)
121+
} else {
122+
assertEqual(t, time.Unix(nextFireTime/int64(time.Second), 0).UTC().Format(readDateLayout),
123+
expected)
124+
}
125+
}
126+
}
127+
91128
func TestCronYearly(t *testing.T) {
92129
prev := int64(1555351200000000000)
93130
result := ""
@@ -121,7 +158,7 @@ func TestCronWeekly(t *testing.T) {
121158
} else {
122159
result, _ = iterate(prev, cronTrigger, 100)
123160
}
124-
assertEqual(t, result, "Mon Mar 15 00:00:00 2021")
161+
assertEqual(t, result, "Sun Mar 14 00:00:00 2021")
125162
}
126163

127164
func TestCronDaily(t *testing.T) {

0 commit comments

Comments
 (0)