Browse Source

Polishing

pull/32864/head
Juergen Hoeller 2 years ago
parent
commit
20dea0dae2
  1. 6
      spring-context/src/main/java/org/springframework/format/datetime/standard/InstantFormatter.java
  2. 8
      spring-context/src/test/java/org/springframework/format/datetime/standard/DateTimeFormattingTests.java
  3. 22
      spring-context/src/test/java/org/springframework/format/datetime/standard/InstantFormatterTests.java

6
spring-context/src/main/java/org/springframework/format/datetime/standard/InstantFormatter.java

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2023 the original author or authors. * Copyright 2002-2024 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -45,12 +45,12 @@ public class InstantFormatter implements Formatter<Instant> {
return Instant.ofEpochMilli(Long.parseLong(text)); return Instant.ofEpochMilli(Long.parseLong(text));
} }
catch (NumberFormatException ex) { catch (NumberFormatException ex) {
if (text.length() > 0 && Character.isAlphabetic(text.charAt(0))) { if (!text.isEmpty() && Character.isAlphabetic(text.charAt(0))) {
// assuming RFC-1123 value a la "Tue, 3 Jun 2008 11:05:30 GMT" // assuming RFC-1123 value a la "Tue, 3 Jun 2008 11:05:30 GMT"
return Instant.from(DateTimeFormatter.RFC_1123_DATE_TIME.parse(text)); return Instant.from(DateTimeFormatter.RFC_1123_DATE_TIME.parse(text));
} }
else { else {
// assuming UTC instant a la "2007-12-03T10:15:30.00Z" // assuming UTC instant a la "2007-12-03T10:15:30.000Z"
return Instant.parse(text); return Instant.parse(text);
} }
} }

8
spring-context/src/test/java/org/springframework/format/datetime/standard/DateTimeFormattingTests.java

@ -644,10 +644,10 @@ class DateTimeFormattingTests {
@DateTimeFormat(style = "M-") @DateTimeFormat(style = "M-")
private LocalDate styleLocalDate; private LocalDate styleLocalDate;
@DateTimeFormat(style = "S-", fallbackPatterns = { "yyyy-MM-dd", "yyyyMMdd", "yyyy.MM.dd" }) @DateTimeFormat(style = "S-", fallbackPatterns = {"yyyy-MM-dd", "yyyyMMdd", "yyyy.MM.dd"})
private LocalDate styleLocalDateWithFallbackPatterns; private LocalDate styleLocalDateWithFallbackPatterns;
@DateTimeFormat(pattern = "yyyy-MM-dd", fallbackPatterns = { "M/d/yy", "yyyyMMdd", "yyyy.MM.dd" }) @DateTimeFormat(pattern = "yyyy-MM-dd", fallbackPatterns = {"M/d/yy", "yyyyMMdd", "yyyy.MM.dd"})
private LocalDate patternLocalDateWithFallbackPatterns; private LocalDate patternLocalDateWithFallbackPatterns;
private LocalTime localTime; private LocalTime localTime;
@ -655,7 +655,7 @@ class DateTimeFormattingTests {
@DateTimeFormat(style = "-M") @DateTimeFormat(style = "-M")
private LocalTime styleLocalTime; private LocalTime styleLocalTime;
@DateTimeFormat(style = "-M", fallbackPatterns = { "HH:mm:ss", "HH:mm"}) @DateTimeFormat(style = "-M", fallbackPatterns = {"HH:mm:ss", "HH:mm"})
private LocalTime styleLocalTimeWithFallbackPatterns; private LocalTime styleLocalTimeWithFallbackPatterns;
private LocalDateTime localDateTime; private LocalDateTime localDateTime;
@ -675,7 +675,7 @@ class DateTimeFormattingTests {
@DateTimeFormat(iso = ISO.DATE_TIME) @DateTimeFormat(iso = ISO.DATE_TIME)
private LocalDateTime isoLocalDateTime; private LocalDateTime isoLocalDateTime;
@DateTimeFormat(iso = ISO.DATE_TIME, fallbackPatterns = { "yyyy-MM-dd HH:mm:ss", "M/d/yy HH:mm"}) @DateTimeFormat(iso = ISO.DATE_TIME, fallbackPatterns = {"yyyy-MM-dd HH:mm:ss", "M/d/yy HH:mm"})
private LocalDateTime isoLocalDateTimeWithFallbackPatterns; private LocalDateTime isoLocalDateTimeWithFallbackPatterns;
private Instant instant; private Instant instant;

22
spring-context/src/test/java/org/springframework/format/datetime/standard/InstantFormatterTests.java

@ -20,6 +20,7 @@ import java.text.ParseException;
import java.time.Instant; import java.time.Instant;
import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit; import java.time.temporal.ChronoUnit;
import java.util.Locale;
import java.util.Random; import java.util.Random;
import java.util.stream.Stream; import java.util.stream.Stream;
@ -50,13 +51,12 @@ class InstantFormatterTests {
private final InstantFormatter instantFormatter = new InstantFormatter(); private final InstantFormatter instantFormatter = new InstantFormatter();
@ParameterizedTest @ParameterizedTest
@ArgumentsSource(ISOSerializedInstantProvider.class) @ArgumentsSource(ISOSerializedInstantProvider.class)
void should_parse_an_ISO_formatted_string_representation_of_an_Instant(String input) throws ParseException { void should_parse_an_ISO_formatted_string_representation_of_an_Instant(String input) throws ParseException {
Instant expected = DateTimeFormatter.ISO_INSTANT.parse(input, Instant::from); Instant expected = DateTimeFormatter.ISO_INSTANT.parse(input, Instant::from);
Instant actual = instantFormatter.parse(input, Locale.US);
Instant actual = instantFormatter.parse(input, null);
assertThat(actual).isEqualTo(expected); assertThat(actual).isEqualTo(expected);
} }
@ -64,9 +64,7 @@ class InstantFormatterTests {
@ArgumentsSource(RFC1123SerializedInstantProvider.class) @ArgumentsSource(RFC1123SerializedInstantProvider.class)
void should_parse_an_RFC1123_formatted_string_representation_of_an_Instant(String input) throws ParseException { void should_parse_an_RFC1123_formatted_string_representation_of_an_Instant(String input) throws ParseException {
Instant expected = DateTimeFormatter.RFC_1123_DATE_TIME.parse(input, Instant::from); Instant expected = DateTimeFormatter.RFC_1123_DATE_TIME.parse(input, Instant::from);
Instant actual = instantFormatter.parse(input, Locale.US);
Instant actual = instantFormatter.parse(input, null);
assertThat(actual).isEqualTo(expected); assertThat(actual).isEqualTo(expected);
} }
@ -74,20 +72,18 @@ class InstantFormatterTests {
@ArgumentsSource(RandomInstantProvider.class) @ArgumentsSource(RandomInstantProvider.class)
void should_serialize_an_Instant_using_ISO_format_and_ignoring_Locale(Instant input) { void should_serialize_an_Instant_using_ISO_format_and_ignoring_Locale(Instant input) {
String expected = DateTimeFormatter.ISO_INSTANT.format(input); String expected = DateTimeFormatter.ISO_INSTANT.format(input);
String actual = instantFormatter.print(input, Locale.US);
String actual = instantFormatter.print(input, null);
assertThat(actual).isEqualTo(expected); assertThat(actual).isEqualTo(expected);
} }
@ParameterizedTest @ParameterizedTest
@ArgumentsSource(RandomEpochMillisProvider.class) @ArgumentsSource(RandomEpochMillisProvider.class)
void should_parse_into_an_Instant_from_epoch_milli(Instant input) throws ParseException { void should_parse_into_an_Instant_from_epoch_milli(Instant input) throws ParseException {
Instant actual = instantFormatter.parse(Long.toString(input.toEpochMilli()), null); Instant actual = instantFormatter.parse(Long.toString(input.toEpochMilli()), Locale.US);
assertThat(actual).isEqualTo(input); assertThat(actual).isEqualTo(input);
} }
private static class RandomInstantProvider implements ArgumentsProvider { private static class RandomInstantProvider implements ArgumentsProvider {
private static final long DATA_SET_SIZE = 10; private static final long DATA_SET_SIZE = 10;
@ -109,6 +105,7 @@ class InstantFormatterTests {
} }
} }
private static class ISOSerializedInstantProvider extends RandomInstantProvider { private static class ISOSerializedInstantProvider extends RandomInstantProvider {
@Override @Override
@ -117,6 +114,7 @@ class InstantFormatterTests {
} }
} }
private static class RFC1123SerializedInstantProvider extends RandomInstantProvider { private static class RFC1123SerializedInstantProvider extends RandomInstantProvider {
// RFC-1123 supports only 4-digit years // RFC-1123 supports only 4-digit years
@ -130,6 +128,8 @@ class InstantFormatterTests {
.map(DateTimeFormatter.RFC_1123_DATE_TIME.withZone(systemDefault())::format); .map(DateTimeFormatter.RFC_1123_DATE_TIME.withZone(systemDefault())::format);
} }
} }
private static final class RandomEpochMillisProvider implements ArgumentsProvider { private static final class RandomEpochMillisProvider implements ArgumentsProvider {
private static final long DATA_SET_SIZE = 10; private static final long DATA_SET_SIZE = 10;

Loading…
Cancel
Save