Skip to content

Commit 1afac89

Browse files
committed
Merge branch '2.19'
2 parents 20aef94 + bdac46a commit 1afac89

File tree

4 files changed

+41
-2
lines changed

4 files changed

+41
-2
lines changed

datetime/src/main/java/tools/jackson/datatype/jsr310/deser/InstantDeserializer.java

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,10 +55,23 @@ public class InstantDeserializer<T extends Temporal>
5555
= JavaTimeFeature.ALWAYS_ALLOW_STRINGIFIED_DATE_TIMESTAMPS.enabledByDefault();
5656

5757
/**
58-
* Constants used to check if ISO 8601 time string is colonless. See [jackson-modules-java8#131]
58+
* Constants used to check if ISO 8601 time string is colon-less. See [jackson-modules-java8#131]
5959
*/
6060
protected static final Pattern ISO8601_COLONLESS_OFFSET_REGEX = Pattern.compile("[+-][0-9]{4}(?=\\[|$)");
6161

62+
// @since 2.18.2
63+
private static OffsetDateTime decimalToOffsetDateTime(FromDecimalArguments args) {
64+
// [jackson-modules-java8#308] Since 2.18.2 : Fix can't deserialize OffsetDateTime.MIN: Invalid value for EpochDay
65+
if (args.integer == OffsetDateTime.MIN.toEpochSecond() && args.fraction == OffsetDateTime.MIN.getNano()) {
66+
return OffsetDateTime.ofInstant(Instant.ofEpochSecond(OffsetDateTime.MIN.toEpochSecond(), OffsetDateTime.MIN.getNano()), OffsetDateTime.MIN.getOffset());
67+
}
68+
// [jackson-modules-java8#308] Since 2.18.2 : For OffsetDateTime.MAX case
69+
if (args.integer == OffsetDateTime.MAX.toEpochSecond() && args.fraction == OffsetDateTime.MAX.getNano()) {
70+
return OffsetDateTime.ofInstant(Instant.ofEpochSecond(OffsetDateTime.MAX.toEpochSecond(), OffsetDateTime.MAX.getNano()), OffsetDateTime.MAX.getOffset());
71+
}
72+
return OffsetDateTime.ofInstant(Instant.ofEpochSecond(args.integer, args.fraction), args.zoneId);
73+
}
74+
6275
public static final InstantDeserializer<Instant> INSTANT = new InstantDeserializer<>(
6376
Instant.class, DateTimeFormatter.ISO_INSTANT,
6477
Instant::from,
@@ -74,7 +87,7 @@ public class InstantDeserializer<T extends Temporal>
7487
OffsetDateTime.class, DateTimeFormatter.ISO_OFFSET_DATE_TIME,
7588
OffsetDateTime::from,
7689
a -> OffsetDateTime.ofInstant(Instant.ofEpochMilli(a.value), a.zoneId),
77-
a -> OffsetDateTime.ofInstant(Instant.ofEpochSecond(a.integer, a.fraction), a.zoneId),
90+
InstantDeserializer::decimalToOffsetDateTime,
7891
(d, z) -> (d.isEqual(OffsetDateTime.MIN) || d.isEqual(OffsetDateTime.MAX) ? d : d.withOffsetSameInstant(z.getRules().getOffset(d.toLocalDateTime()))),
7992
true, // yes, replace zero offset with Z
8093
DEFAULT_NORMALIZE_ZONE_ID,

datetime/src/test/java/tools/jackson/datatype/jsr310/deser/OffsetDateTimeDeserTest.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -732,6 +732,22 @@ public void testDeserializationNoAdjustIfMAX() throws Exception
732732
assertEquals(date.getOffset(),actualValue.getOffset());
733733
}
734734

735+
// [jackson-modules-java8#308] Can't deserialize OffsetDateTime.MIN: Invalid value for EpochDay
736+
@Test
737+
public void testOffsetDateTimeMinOrMax() throws Exception
738+
{
739+
_testOffsetDateTimeMinOrMax(OffsetDateTime.MIN);
740+
_testOffsetDateTimeMinOrMax(OffsetDateTime.MAX);
741+
}
742+
743+
private void _testOffsetDateTimeMinOrMax(OffsetDateTime offsetDateTime)
744+
throws Exception
745+
{
746+
String ser = MAPPER.writeValueAsString(offsetDateTime);
747+
OffsetDateTime result = MAPPER.readValue(ser, OffsetDateTime.class);
748+
assertIsEqual(offsetDateTime, result);
749+
}
750+
735751
private static void assertIsEqual(OffsetDateTime expected, OffsetDateTime actual)
736752
{
737753
assertTrue("The value is not correct. Expected timezone-adjusted <" + expected + ">, actual <" + actual + ">.",

release-notes/CREDITS-2.x

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -203,3 +203,7 @@ Emanuel Trandafir (@etrandafir93)
203203
Ólafur Bragason (@olibraga)
204204
* Reported #319: `java.time.DateTimeException` serialization fails
205205
(2.18.1)
206+
207+
Joo Hyuk Kim (@JooHyukKim)
208+
* Fixed #308: Can't deserialize `OffsetDateTime.MIN`: Invalid value for EpochDay
209+
(2.18.2)

release-notes/VERSION-2.x

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,12 @@ Modules:
1212

1313
-
1414

15+
2.18.2 (not yet released)
16+
17+
#308: Can't deserialize `OffsetDateTime.MIN`: Invalid value for EpochDay
18+
(reported by @sszuev)
19+
(fix by Joo-Hyuk K)
20+
1521
2.18.1 (28-Oct-2024)
1622
1723
#319: `java.time.DateTimeException` serialization fails

0 commit comments

Comments
 (0)