From b21366db6d3e0f3f5b677bd89f5959cf76076a3a Mon Sep 17 00:00:00 2001 From: Yingzi Zhang Date: Mon, 28 Sep 2026 09:48:47 -0400 Subject: [PATCH 1/2] Fix formatting a zero period with a weeks unit See gh-51892 Signed-off-by: Yingzi Zhang --- .../org/springframework/boot/convert/PeriodStyle.java | 3 ++- .../springframework/boot/convert/PeriodStyleTests.java | 6 ++++++ .../boot/convert/PeriodToStringConverterTests.java | 9 +++++++++ 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/core/spring-boot/src/main/java/org/springframework/boot/convert/PeriodStyle.java b/core/spring-boot/src/main/java/org/springframework/boot/convert/PeriodStyle.java index 1feaafe59d3..f46ba53f394 100644 --- a/core/spring-boot/src/main/java/org/springframework/boot/convert/PeriodStyle.java +++ b/core/spring-boot/src/main/java/org/springframework/boot/convert/PeriodStyle.java @@ -31,6 +31,7 @@ import org.springframework.util.Assert; * * @author Eddú Meléndez * @author Edson Chávez + * @author Yingzi Zhang * @author Valentine Wu * @since 2.3.0 * @see Period @@ -85,7 +86,7 @@ public enum PeriodStyle { @Override public String print(Period value, @Nullable ChronoUnit unit) { if (value.isZero()) { - return Unit.fromChronoUnit(unit).print(value); + return "0" + Unit.fromChronoUnit(unit).suffix; } StringBuilder result = new StringBuilder(); append(result, value, Unit.YEARS); diff --git a/core/spring-boot/src/test/java/org/springframework/boot/convert/PeriodStyleTests.java b/core/spring-boot/src/test/java/org/springframework/boot/convert/PeriodStyleTests.java index 27f093a7ea8..3cd5c0ee0cb 100644 --- a/core/spring-boot/src/test/java/org/springframework/boot/convert/PeriodStyleTests.java +++ b/core/spring-boot/src/test/java/org/springframework/boot/convert/PeriodStyleTests.java @@ -29,6 +29,7 @@ import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException * * @author Eddú Meléndez * @author Edson Chávez + * @author Yingzi Zhang * @author Valentine Wu */ class PeriodStyleTests { @@ -222,6 +223,11 @@ class PeriodStyleTests { assertThat(PeriodStyle.SIMPLE.print(period, ChronoUnit.YEARS)).isEqualTo("0y"); } + @Test + void printSimpleWhenZeroWithWeeksUnitShouldPrintInWeeks() { + assertThat(PeriodStyle.SIMPLE.print(Period.ZERO, ChronoUnit.WEEKS)).isEqualTo("0w"); + } + @Test void printSimpleWhenNonZeroShouldIgnoreUnit() { Period period = Period.of(1, 2, 3); diff --git a/core/spring-boot/src/test/java/org/springframework/boot/convert/PeriodToStringConverterTests.java b/core/spring-boot/src/test/java/org/springframework/boot/convert/PeriodToStringConverterTests.java index 6ee24247698..a975ef5d327 100644 --- a/core/spring-boot/src/test/java/org/springframework/boot/convert/PeriodToStringConverterTests.java +++ b/core/spring-boot/src/test/java/org/springframework/boot/convert/PeriodToStringConverterTests.java @@ -32,6 +32,7 @@ import static org.assertj.core.api.Assertions.assertThat; * * @author Eddú Melendez * @author Edson Chávez + * @author Yingzi Zhang */ class PeriodToStringConverterTests { @@ -63,6 +64,14 @@ class PeriodToStringConverterTests { assertThat(converted).isEqualTo("0y"); } + @ConversionServiceTest + void convertWithFormatAndWeeksUnitWhenZeroShouldUseFormatAndUnit(ConversionService conversionService) { + String converted = (String) conversionService.convert(Period.ZERO, + MockPeriodTypeDescriptor.get(ChronoUnit.WEEKS, PeriodStyle.SIMPLE), + TypeDescriptor.valueOf(String.class)); + assertThat(converted).isEqualTo("0w"); + } + @ConversionServiceTest void convertWithFormatAndUnitWhenNonZeroShouldUseFormatAndIgnoreUnit(ConversionService conversionService) { String converted = (String) conversionService.convert(Period.of(1, 0, 3), From d9df34b8278a6f21f1ecf8ba9dca6a42d075c091 Mon Sep 17 00:00:00 2001 From: Phillip Webb Date: Mon, 28 Sep 2026 07:53:04 -0700 Subject: [PATCH 2/2] Polish 'Fix formatting a zero period with a weeks unit' See gh-51892 --- .../java/org/springframework/boot/convert/PeriodStyle.java | 7 +++++-- .../org/springframework/boot/convert/PeriodStyleTests.java | 4 ---- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/core/spring-boot/src/main/java/org/springframework/boot/convert/PeriodStyle.java b/core/spring-boot/src/main/java/org/springframework/boot/convert/PeriodStyle.java index f46ba53f394..cb73a7142ad 100644 --- a/core/spring-boot/src/main/java/org/springframework/boot/convert/PeriodStyle.java +++ b/core/spring-boot/src/main/java/org/springframework/boot/convert/PeriodStyle.java @@ -86,7 +86,7 @@ public enum PeriodStyle { @Override public String print(Period value, @Nullable ChronoUnit unit) { if (value.isZero()) { - return "0" + Unit.fromChronoUnit(unit).suffix; + return Unit.fromChronoUnit(unit).print(value); } StringBuilder result = new StringBuilder(); append(result, value, Unit.YEARS); @@ -263,10 +263,13 @@ public enum PeriodStyle { } private boolean isZero(Period value) { - return intValue(value) == 0; + return value.isZero() || intValue(value) == 0; } private int intValue(Period value) { + if (value.isZero()) { + return 0; + } Assert.state(this.intValue != null, () -> "intValue cannot be extracted from " + name()); return this.intValue.apply(value); } diff --git a/core/spring-boot/src/test/java/org/springframework/boot/convert/PeriodStyleTests.java b/core/spring-boot/src/test/java/org/springframework/boot/convert/PeriodStyleTests.java index 3cd5c0ee0cb..7de907443f3 100644 --- a/core/spring-boot/src/test/java/org/springframework/boot/convert/PeriodStyleTests.java +++ b/core/spring-boot/src/test/java/org/springframework/boot/convert/PeriodStyleTests.java @@ -221,10 +221,6 @@ class PeriodStyleTests { void printSimpleWhenZeroWithUnitShouldPrintInUnit() { Period period = Period.ofYears(0); assertThat(PeriodStyle.SIMPLE.print(period, ChronoUnit.YEARS)).isEqualTo("0y"); - } - - @Test - void printSimpleWhenZeroWithWeeksUnitShouldPrintInWeeks() { assertThat(PeriodStyle.SIMPLE.print(Period.ZERO, ChronoUnit.WEEKS)).isEqualTo("0w"); }