diff --git a/spring-context/src/main/java/org/springframework/scheduling/support/CronExpression.java b/spring-context/src/main/java/org/springframework/scheduling/support/CronExpression.java index e3bf57b27ee..08a6444a6b4 100644 --- a/spring-context/src/main/java/org/springframework/scheduling/support/CronExpression.java +++ b/spring-context/src/main/java/org/springframework/scheduling/support/CronExpression.java @@ -121,9 +121,7 @@ public final class CronExpression { * *
  • * In the "day of week" field, {@code L} stands for "the last day of the - * week", and uses the - * {@linkplain java.util.Locale#getDefault() system default locale} - * to determine which day that is (i.e. Sunday or Saturday). + * week". * If prefixed by a number or three-letter name (i.e. {@code dL} or * {@code DDDL}), it means "the last day of week {@code d} (or {@code DDD}) * in the month". @@ -158,7 +156,6 @@ public final class CronExpression { *
  • {@code "0 0 0 L-3 * *"} = third-to-last day of the month at midnight
  • *
  • {@code "0 0 0 1W * *"} = first weekday of the month at midnight
  • *
  • {@code "0 0 0 LW * *"} = last weekday of the month at midnight
  • - *
  • {@code "0 0 0 * * L"} = last day of the week at midnight
  • *
  • {@code "0 0 0 * * 5L"} = last Friday of the month at midnight
  • *
  • {@code "0 0 0 * * THUL"} = last Thursday of the month at midnight
  • *
  • {@code "0 0 0 ? * 5#2"} = the second Friday in the month at midnight
  • diff --git a/spring-context/src/main/java/org/springframework/scheduling/support/QuartzCronField.java b/spring-context/src/main/java/org/springframework/scheduling/support/QuartzCronField.java index 5db9d31bf36..8492a590a18 100644 --- a/spring-context/src/main/java/org/springframework/scheduling/support/QuartzCronField.java +++ b/spring-context/src/main/java/org/springframework/scheduling/support/QuartzCronField.java @@ -23,9 +23,6 @@ import java.time.temporal.ChronoUnit; import java.time.temporal.Temporal; import java.time.temporal.TemporalAdjuster; import java.time.temporal.TemporalAdjusters; -import java.time.temporal.TemporalField; -import java.time.temporal.WeekFields; -import java.util.Locale; import org.springframework.lang.Nullable; import org.springframework.util.Assert; @@ -140,8 +137,8 @@ final class QuartzCronField extends CronField { } else { TemporalAdjuster adjuster; - if (idx == 0) { // "L" - adjuster = lastDayOfWeek(Locale.getDefault()); + if (idx == 0) { + throw new IllegalArgumentException("No day-of-week before 'L' in '" + value + "'"); } else { // "[0-7]L" DayOfWeek dayOfWeek = parseDayOfWeek(value.substring(0, idx)); @@ -196,18 +193,6 @@ final class QuartzCronField extends CronField { }; } - /** - * Return a temporal adjuster that finds the last day-of-week, depending - * on the given locale. - * @param locale the locale to base the last day calculation on - * @return the last day-of-week adjuster - */ - private static TemporalAdjuster lastDayOfWeek(Locale locale) { - Assert.notNull(locale, "Locale must not be null"); - TemporalField dayOfWeek = WeekFields.of(locale).dayOfWeek(); - return temporal -> temporal.with(dayOfWeek, 7); - } - /** * Return a temporal adjuster that finds the weekday nearest to the given * day-of-month. If {@code dayOfMonth} falls on a Saturday, the date is diff --git a/spring-context/src/test/java/org/springframework/scheduling/support/CronExpressionTests.java b/spring-context/src/test/java/org/springframework/scheduling/support/CronExpressionTests.java index 93206f1d5f7..9d25010cd43 100644 --- a/spring-context/src/test/java/org/springframework/scheduling/support/CronExpressionTests.java +++ b/spring-context/src/test/java/org/springframework/scheduling/support/CronExpressionTests.java @@ -24,14 +24,12 @@ import java.time.ZoneId; import java.time.ZonedDateTime; import java.time.temporal.ChronoField; import java.time.temporal.Temporal; -import java.util.Locale; import org.assertj.core.api.Condition; import org.junit.jupiter.api.Test; import static java.time.DayOfWeek.FRIDAY; import static java.time.DayOfWeek.MONDAY; -import static java.time.DayOfWeek.SATURDAY; import static java.time.DayOfWeek.SUNDAY; import static java.time.DayOfWeek.TUESDAY; import static java.time.DayOfWeek.WEDNESDAY; @@ -736,60 +734,6 @@ class CronExpressionTests { assertThat(actual).is(weekday); } - @Test - public void quartzLastDayOfWeekFirstDayMonday() { - Locale defaultLocale = Locale.getDefault(); - try { - Locale.setDefault(Locale.UK); - - CronExpression expression = CronExpression.parse("0 0 0 * * L"); - - LocalDateTime last = LocalDateTime.of(LocalDate.of(2008, 1, 4), LocalTime.now()); - LocalDateTime expected = LocalDateTime.of(2008, 1, 6, 0, 0); - LocalDateTime actual = expression.next(last); - assertThat(actual).isNotNull(); - assertThat(actual).isEqualTo(expected); - assertThat(actual.getDayOfWeek()).isEqualTo(SUNDAY); - - last = actual; - expected = expected.plusWeeks(1); - actual = expression.next(last); - assertThat(actual).isNotNull(); - assertThat(actual).isEqualTo(expected); - assertThat(actual.getDayOfWeek()).isEqualTo(SUNDAY); - } - finally { - Locale.setDefault(defaultLocale); - } - } - - @Test - public void quartzLastDayOfWeekFirstDaySunday() { - Locale defaultLocale = Locale.getDefault(); - try { - Locale.setDefault(Locale.US); - - CronExpression expression = CronExpression.parse("0 0 0 * * L"); - - LocalDateTime last = LocalDateTime.of(LocalDate.of(2008, 1, 4), LocalTime.now()); - LocalDateTime expected = LocalDateTime.of(2008, 1, 5, 0, 0); - LocalDateTime actual = expression.next(last); - assertThat(actual).isNotNull(); - assertThat(actual).isEqualTo(expected); - assertThat(actual.getDayOfWeek()).isEqualTo(SATURDAY); - - last = actual; - expected = expected.plusWeeks(1); - actual = expression.next(last); - assertThat(actual).isNotNull(); - assertThat(actual).isEqualTo(expected); - assertThat(actual.getDayOfWeek()).isEqualTo(SATURDAY); - } - finally { - Locale.setDefault(defaultLocale); - } - } - @Test public void quartzLastDayOfWeekOffset() { // last Friday (5) of the month diff --git a/spring-context/src/test/java/org/springframework/scheduling/support/QuartzCronFieldTests.java b/spring-context/src/test/java/org/springframework/scheduling/support/QuartzCronFieldTests.java index 3d3c79ada19..bd16243c1bd 100644 --- a/spring-context/src/test/java/org/springframework/scheduling/support/QuartzCronFieldTests.java +++ b/spring-context/src/test/java/org/springframework/scheduling/support/QuartzCronFieldTests.java @@ -18,12 +18,9 @@ package org.springframework.scheduling.support; import java.time.DayOfWeek; import java.time.LocalDate; -import java.util.Locale; import org.junit.jupiter.api.Test; -import static java.time.DayOfWeek.SATURDAY; -import static java.time.DayOfWeek.SUNDAY; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException; @@ -62,48 +59,6 @@ class QuartzCronFieldTests { assertThat(actual).isEqualTo(expected); } - @Test - public void lastDayOfWeekFirstDayMonday() { - Locale defaultLocale = Locale.getDefault(); - try { - Locale.setDefault(Locale.UK); - QuartzCronField field = QuartzCronField.parseDaysOfWeek("L"); - - LocalDate last = LocalDate.of(2020, 6, 16); - LocalDate expected = LocalDate.of(2020, 6, 21); - assertThat(field.nextOrSame(last)).isEqualTo(expected); - - LocalDate actual = field.nextOrSame(last); - assertThat(actual).isNotNull(); - assertThat(actual).isEqualTo(expected); - assertThat(actual.getDayOfWeek()).isEqualTo(SUNDAY); - } - finally { - Locale.setDefault(defaultLocale); - } - } - - @Test - public void lastDayOfWeekFirstDaySunday() { - Locale defaultLocale = Locale.getDefault(); - try { - Locale.setDefault(Locale.US); - QuartzCronField field = QuartzCronField.parseDaysOfWeek("L"); - - LocalDate last = LocalDate.of(2020, 6, 16); - LocalDate expected = LocalDate.of(2020, 6, 20); - assertThat(field.nextOrSame(last)).isEqualTo(expected); - - LocalDate actual = field.nextOrSame(last); - assertThat(actual).isNotNull(); - assertThat(actual).isEqualTo(expected); - assertThat(actual.getDayOfWeek()).isEqualTo(SATURDAY); - } - finally { - Locale.setDefault(defaultLocale); - } - } - @Test void lastDayOfWeekOffset() { // last Thursday (4) of the month @@ -129,6 +84,7 @@ class QuartzCronFieldTests { assertThatIllegalArgumentException().isThrownBy(() -> QuartzCronField.parseDaysOfWeek("")); assertThatIllegalArgumentException().isThrownBy(() -> QuartzCronField.parseDaysOfWeek("1")); + assertThatIllegalArgumentException().isThrownBy(() -> QuartzCronField.parseDaysOfWeek("L")); assertThatIllegalArgumentException().isThrownBy(() -> QuartzCronField.parseDaysOfWeek("L1")); assertThatIllegalArgumentException().isThrownBy(() -> QuartzCronField.parseDaysOfWeek("LL")); assertThatIllegalArgumentException().isThrownBy(() -> QuartzCronField.parseDaysOfWeek("-4L"));