Skip to content
This repository was archived by the owner on Nov 7, 2019. It is now read-only.

Commit f827d43

Browse files
committed
Merge pull request #44 from tinnou/custom_datetime_formatter
Allows users to pass a custom DateTimeFormatter for the ZonedDateTime…
2 parents 117b287 + 2d77ec1 commit f827d43

File tree

2 files changed

+58
-4
lines changed

2 files changed

+58
-4
lines changed

src/main/java/com/fasterxml/jackson/datatype/jsr310/ser/ZonedDateTimeSerializer.java

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,17 @@ public class ZonedDateTimeSerializer extends InstantSerializerBase<ZonedDateTime
1414
public static final ZonedDateTimeSerializer INSTANCE = new ZonedDateTimeSerializer();
1515

1616
protected ZonedDateTimeSerializer() {
17+
// ISO_ZONED_DATE_TIME is not the ISO format, it is an extension of it
18+
this(DateTimeFormatter.ISO_OFFSET_DATE_TIME);
19+
}
20+
21+
public ZonedDateTimeSerializer(DateTimeFormatter formatter) {
1722
super(ZonedDateTime.class, dt -> dt.toInstant().toEpochMilli(),
18-
ZonedDateTime::toEpochSecond, ZonedDateTime::getNano,
19-
// ISO_ZONED_DATE_TIME is not the ISO format, it is an extension of it
20-
DateTimeFormatter.ISO_OFFSET_DATE_TIME);
23+
ZonedDateTime::toEpochSecond, ZonedDateTime::getNano,
24+
formatter);
2125
}
2226

23-
protected ZonedDateTimeSerializer(ZonedDateTimeSerializer base,
27+
private ZonedDateTimeSerializer(ZonedDateTimeSerializer base,
2428
Boolean useTimestamp, DateTimeFormatter formatter) {
2529
super(base, useTimestamp, formatter);
2630
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package com.fasterxml.jackson.datatype.jsr310;
2+
3+
import com.fasterxml.jackson.databind.ObjectMapper;
4+
import com.fasterxml.jackson.databind.SerializationFeature;
5+
import com.fasterxml.jackson.databind.module.SimpleModule;
6+
import com.fasterxml.jackson.datatype.jsr310.ser.ZonedDateTimeSerializer;
7+
import org.junit.Test;
8+
import org.junit.runner.RunWith;
9+
import org.junit.runners.Parameterized;
10+
import org.junit.runners.Parameterized.Parameters;
11+
12+
import java.time.ZonedDateTime;
13+
import java.time.format.DateTimeFormatter;
14+
import java.util.ArrayList;
15+
import java.util.Collection;
16+
17+
import static org.junit.Assert.assertThat;
18+
import static org.junit.internal.matchers.StringContains.containsString;
19+
20+
@RunWith(Parameterized.class)
21+
public class TestZonedDateTimeSerializationWithCustomFormatter {
22+
private final DateTimeFormatter formatter;
23+
24+
public TestZonedDateTimeSerializationWithCustomFormatter(DateTimeFormatter formatter) {
25+
this.formatter = formatter;
26+
}
27+
28+
@Test
29+
public void testSerialization() throws Exception {
30+
ZonedDateTime zonedDateTime = ZonedDateTime.now();
31+
assertThat(serializeWith(zonedDateTime, formatter), containsString(zonedDateTime.format(formatter)));
32+
}
33+
34+
private String serializeWith(ZonedDateTime zonedDateTime, DateTimeFormatter formatter) throws Exception {
35+
ObjectMapper mapper = new ObjectMapper().registerModule(new SimpleModule().addSerializer(
36+
new ZonedDateTimeSerializer(formatter)));
37+
mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
38+
return mapper.writeValueAsString(zonedDateTime);
39+
}
40+
41+
@Parameters
42+
public static Collection<Object[]> customFormatters() {
43+
Collection<Object[]> formatters = new ArrayList<>();
44+
formatters.add(new Object[]{DateTimeFormatter.ISO_ZONED_DATE_TIME});
45+
formatters.add(new Object[]{DateTimeFormatter.ISO_OFFSET_DATE_TIME});
46+
formatters.add(new Object[]{DateTimeFormatter.ISO_LOCAL_DATE_TIME});
47+
formatters.add(new Object[]{DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSZ")});
48+
return formatters;
49+
}
50+
}

0 commit comments

Comments
 (0)