Skip to content

Commit f545764

Browse files
rafissmp911de
authored andcommitted
Parse UTC timestamps with +00:00 offset
Previously, the timestamp parser would throw an exception if it received a value with an offset of "+00:00". It would only work if the offset were "+00". Now, it works with both formats. [closes #320][#321]
1 parent efd496f commit f545764

File tree

5 files changed

+49
-1
lines changed

5 files changed

+49
-1
lines changed

src/main/java/io/r2dbc/postgresql/codec/PostgresqlDateTimeFormatter.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ class PostgresqlDateTimeFormatter {
4848
.appendFraction(NANO_OF_SECOND, 0, 9, true)
4949
.optionalEnd()
5050
.optionalStart()
51-
.appendOffset("+HH:mm", "+00")
51+
.appendOffset("+HH:mm", "+00:00")
5252
.optionalEnd()
5353
.toFormatter();
5454

src/test/java/io/r2dbc/postgresql/codec/InstantCodecUnitTests.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,10 +66,23 @@ void decodeFromTimestampWithTimezone() {
6666
ZonedDateTime zonedDateTime = ZonedDateTime.parse("2018-11-05T00:20:25.039883+09:00[Asia/Tokyo]");
6767
Instant instant = zonedDateTime.toInstant();
6868

69+
assertThat(new InstantCodec(TEST).decode(encode(TEST, "2018-11-05 00:20:25.039883+09:00"), TIMESTAMPTZ.getObjectId(), FORMAT_TEXT, Instant.class))
70+
.isEqualTo(instant);
6971
assertThat(new InstantCodec(TEST).decode(encode(TEST, "2018-11-05 00:20:25.039883+09"), TIMESTAMPTZ.getObjectId(), FORMAT_TEXT, Instant.class))
7072
.isEqualTo(instant);
7173
}
7274

75+
@Test
76+
void decodeFromTimestampWithTimezoneUTC() {
77+
ZonedDateTime zonedDateTime = ZonedDateTime.parse("2018-11-05T00:20:25.039883+00:00");
78+
Instant instant = zonedDateTime.toInstant();
79+
80+
assertThat(new InstantCodec(TEST).decode(encode(TEST, "2018-11-05 00:20:25.039883+00:00"), TIMESTAMPTZ.getObjectId(), FORMAT_TEXT, Instant.class))
81+
.isEqualTo(instant);
82+
assertThat(new InstantCodec(TEST).decode(encode(TEST, "2018-11-05 00:20:25.039883+00"), TIMESTAMPTZ.getObjectId(), FORMAT_TEXT, Instant.class))
83+
.isEqualTo(instant);
84+
}
85+
7386
@Test
7487
void decodeNoByteBuf() {
7588
assertThat(new InstantCodec(TEST).decode(null, dataType, FORMAT_TEXT, Instant.class)).isNull();

src/test/java/io/r2dbc/postgresql/codec/LocalDateTimeCodecUnitTests.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import io.r2dbc.postgresql.client.Parameter;
2020
import org.junit.jupiter.api.Test;
2121

22+
import java.time.Instant;
2223
import java.time.LocalDateTime;
2324

2425
import static io.r2dbc.postgresql.client.Parameter.NULL_VALUE;
@@ -54,6 +55,16 @@ void decode() {
5455
.isEqualTo(localDateTime);
5556
}
5657

58+
@Test
59+
void decodeUTC() {
60+
LocalDateTime localDateTime = LocalDateTime.parse("2018-11-05T00:06:31.700426");
61+
62+
assertThat(new LocalDateTimeCodec(TEST).decode(encode(TEST, "2018-11-05 00:06:31.700426+00:00"), dataType, FORMAT_TEXT, LocalDateTime.class))
63+
.isEqualTo(localDateTime);
64+
assertThat(new LocalDateTimeCodec(TEST).decode(encode(TEST, "2018-11-05 00:06:31.700426+00"), dataType, FORMAT_TEXT, LocalDateTime.class))
65+
.isEqualTo(localDateTime);
66+
}
67+
5768
@Test
5869
void decodeNoByteBuf() {
5970
assertThat(new LocalDateTimeCodec(TEST).decode(null, dataType, FORMAT_TEXT, LocalDateTime.class)).isNull();

src/test/java/io/r2dbc/postgresql/codec/OffsetDateTimeCodecUnitTests.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,10 +50,22 @@ void constructorNoByteBufAllocator() {
5050
void decode() {
5151
OffsetDateTime offsetDateTime = OffsetDateTime.parse("2018-11-05T00:16:00.899797+09:00");
5252

53+
assertThat(new OffsetDateTimeCodec(TEST).decode(encode(TEST, "2018-11-05 00:16:00.899797+09:00"), dataType, FORMAT_TEXT, OffsetDateTime.class))
54+
.isEqualTo(offsetDateTime);
5355
assertThat(new OffsetDateTimeCodec(TEST).decode(encode(TEST, "2018-11-05 00:16:00.899797+09"), dataType, FORMAT_TEXT, OffsetDateTime.class))
5456
.isEqualTo(offsetDateTime);
5557
}
5658

59+
@Test
60+
void decodeUTC() {
61+
OffsetDateTime offsetDateTime = OffsetDateTime.parse("2018-11-05T00:16:00.899797+00:00");
62+
63+
assertThat(new OffsetDateTimeCodec(TEST).decode(encode(TEST, "2018-11-05 00:16:00.899797+00:00"), dataType, FORMAT_TEXT, OffsetDateTime.class))
64+
.isEqualTo(offsetDateTime);
65+
assertThat(new OffsetDateTimeCodec(TEST).decode(encode(TEST, "2018-11-05 00:16:00.899797+00"), dataType, FORMAT_TEXT, OffsetDateTime.class))
66+
.isEqualTo(offsetDateTime);
67+
}
68+
5769
@Test
5870
void decodeNoByteBuf() {
5971
assertThat(new OffsetDateTimeCodec(TEST).decode(null, dataType, FORMAT_TEXT, OffsetDateTime.class)).isNull();

src/test/java/io/r2dbc/postgresql/codec/ZonedDateTimeCodecUnitTests.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,10 +50,22 @@ void constructorNoByteBufAllocator() {
5050
void decode() {
5151
ZonedDateTime zonedDateTime = ZonedDateTime.parse("2018-11-05T00:20:25.039883+09:00[Asia/Tokyo]");
5252

53+
assertThat(new ZonedDateTimeCodec(TEST).decode(encode(TEST, "2018-11-05 00:20:25.039883+09:00"), dataType, FORMAT_TEXT, ZonedDateTime.class))
54+
.isEqualTo(zonedDateTime);
5355
assertThat(new ZonedDateTimeCodec(TEST).decode(encode(TEST, "2018-11-05 00:20:25.039883+09"), dataType, FORMAT_TEXT, ZonedDateTime.class))
5456
.isEqualTo(zonedDateTime);
5557
}
5658

59+
@Test
60+
void decodeUTC() {
61+
ZonedDateTime zonedDateTime = ZonedDateTime.parse("2018-11-05T00:20:25.039883+00:00");
62+
63+
assertThat(new ZonedDateTimeCodec(TEST).decode(encode(TEST, "2018-11-05 00:20:25.039883+00:00"), dataType, FORMAT_TEXT, ZonedDateTime.class))
64+
.isEqualTo(zonedDateTime);
65+
assertThat(new ZonedDateTimeCodec(TEST).decode(encode(TEST, "2018-11-05 00:20:25.039883+00"), dataType, FORMAT_TEXT, ZonedDateTime.class))
66+
.isEqualTo(zonedDateTime);
67+
}
68+
5769
@Test
5870
void decodeNoByteBuf() {
5971
assertThat(new ZonedDateTimeCodec(TEST).decode(null, dataType, FORMAT_TEXT, ZonedDateTime.class)).isNull();

0 commit comments

Comments
 (0)