Skip to content

Commit c26b462

Browse files
committed
Merge pull request #21630 from gaurav-91
* gh-21630: Polish "Support iso-offset for date-time and time formatting with MVC" Support iso-offset for date-time and time formatting with MVC Closes gh-21630
2 parents bb1a0ff + 9230ea4 commit c26b462

File tree

3 files changed

+56
-2
lines changed

3 files changed

+56
-2
lines changed

spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/format/DateTimeFormatters.java

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
* {@link DateTimeFormatter Formatters} for dates, times, and date-times.
2626
*
2727
* @author Andy Wilkinson
28+
* @author Gaurav Pareek
2829
* @since 2.3.0
2930
*/
3031
public class DateTimeFormatters {
@@ -60,7 +61,8 @@ public DateTimeFormatters dateFormat(String pattern) {
6061
* @return {@code this} for chained method invocation
6162
*/
6263
public DateTimeFormatters timeFormat(String pattern) {
63-
this.timeFormatter = isIso(pattern) ? DateTimeFormatter.ISO_LOCAL_TIME : formatter(pattern);
64+
this.timeFormatter = isIso(pattern) ? DateTimeFormatter.ISO_LOCAL_TIME
65+
: (isIsoOffset(pattern) ? DateTimeFormatter.ISO_OFFSET_TIME : formatter(pattern));
6466
return this;
6567
}
6668

@@ -70,7 +72,8 @@ public DateTimeFormatters timeFormat(String pattern) {
7072
* @return {@code this} for chained method invocation
7173
*/
7274
public DateTimeFormatters dateTimeFormat(String pattern) {
73-
this.dateTimeFormatter = isIso(pattern) ? DateTimeFormatter.ISO_LOCAL_DATE_TIME : formatter(pattern);
75+
this.dateTimeFormatter = isIso(pattern) ? DateTimeFormatter.ISO_LOCAL_DATE_TIME
76+
: (isIsoOffset(pattern) ? DateTimeFormatter.ISO_OFFSET_DATE_TIME : formatter(pattern));
7477
return this;
7578
}
7679

@@ -103,4 +106,8 @@ private static boolean isIso(String pattern) {
103106
return "iso".equalsIgnoreCase(pattern);
104107
}
105108

109+
private static boolean isIsoOffset(String pattern) {
110+
return "isooffset".equalsIgnoreCase(pattern) || "iso-offset".equalsIgnoreCase(pattern);
111+
}
112+
106113
}

spring-boot-project/spring-boot-autoconfigure/src/main/resources/META-INF/additional-spring-configuration-metadata.json

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1964,6 +1964,10 @@
19641964
{
19651965
"value": "iso",
19661966
"description": "ISO-8601 extended local date-time format."
1967+
},
1968+
{
1969+
"value": "iso-offset",
1970+
"description": "ISO offset date-time format."
19671971
}
19681972
],
19691973
"providers": [
@@ -1982,6 +1986,10 @@
19821986
{
19831987
"value": "iso",
19841988
"description": "ISO-8601 extended local time format"
1989+
},
1990+
{
1991+
"value": "iso-offset",
1992+
"description": "ISO offset time format."
19851993
}
19861994
],
19871995
"providers": [

spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/web/format/WebConversionServiceTests.java

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,10 @@
1919
import java.time.LocalDate;
2020
import java.time.LocalDateTime;
2121
import java.time.LocalTime;
22+
import java.time.OffsetDateTime;
23+
import java.time.OffsetTime;
2224
import java.time.ZoneId;
25+
import java.time.ZoneOffset;
2326
import java.time.ZonedDateTime;
2427
import java.time.format.DateTimeFormatter;
2528
import java.time.format.FormatStyle;
@@ -35,6 +38,7 @@
3538
*
3639
* @author Brian Clozel
3740
* @author Madhura Bhave
41+
* @author Gaurav Pareek
3842
*/
3943
class WebConversionServiceTests {
4044

@@ -80,6 +84,23 @@ void isoTimeFormat() {
8084
.isEqualTo(DateTimeFormatter.ISO_LOCAL_TIME.format(time));
8185
}
8286

87+
@Test
88+
void isoOffsetTimeFormat() {
89+
isoOffsetTimeFormat(new DateTimeFormatters().timeFormat("isooffset"));
90+
}
91+
92+
@Test
93+
void hyphenatedIsoOffsetTimeFormat() {
94+
isoOffsetTimeFormat(new DateTimeFormatters().timeFormat("iso-offset"));
95+
}
96+
97+
private void isoOffsetTimeFormat(DateTimeFormatters formatters) {
98+
WebConversionService conversionService = new WebConversionService(formatters);
99+
OffsetTime offsetTime = OffsetTime.of(LocalTime.of(12, 45, 23), ZoneOffset.ofHoursMinutes(1, 30));
100+
assertThat(conversionService.convert(offsetTime, String.class))
101+
.isEqualTo(DateTimeFormatter.ISO_OFFSET_TIME.format(offsetTime));
102+
}
103+
83104
@Test
84105
void customTimeFormat() {
85106
WebConversionService conversionService = new WebConversionService(
@@ -105,6 +126,24 @@ void isoDateTimeFormat() {
105126
.isEqualTo(DateTimeFormatter.ISO_LOCAL_DATE_TIME.format(dateTime));
106127
}
107128

129+
@Test
130+
void isoOffsetDateTimeFormat() {
131+
isoOffsetDateTimeFormat(new DateTimeFormatters().dateTimeFormat("isooffset"));
132+
}
133+
134+
@Test
135+
void hyphenatedIsoOffsetDateTimeFormat() {
136+
isoOffsetDateTimeFormat(new DateTimeFormatters().dateTimeFormat("iso-offset"));
137+
}
138+
139+
private void isoOffsetDateTimeFormat(DateTimeFormatters formatters) {
140+
WebConversionService conversionService = new WebConversionService(formatters);
141+
OffsetDateTime offsetdate = OffsetDateTime.of(LocalDate.of(2020, 4, 26), LocalTime.of(12, 45, 23),
142+
ZoneOffset.ofHoursMinutes(1, 30));
143+
assertThat(conversionService.convert(offsetdate, String.class))
144+
.isEqualTo(DateTimeFormatter.ISO_OFFSET_DATE_TIME.format(offsetdate));
145+
}
146+
108147
@Test
109148
void customDateTimeFormat() {
110149
WebConversionService conversionService = new WebConversionService(

0 commit comments

Comments
 (0)