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

Allows users to pass a custom DateTimeFormatter for the ZonedDateTime… #44

Merged
merged 1 commit into from
Oct 2, 2015
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -14,13 +14,17 @@ public class ZonedDateTimeSerializer extends InstantSerializerBase<ZonedDateTime
public static final ZonedDateTimeSerializer INSTANCE = new ZonedDateTimeSerializer();

protected ZonedDateTimeSerializer() {
// ISO_ZONED_DATE_TIME is not the ISO format, it is an extension of it
this(DateTimeFormatter.ISO_OFFSET_DATE_TIME);
}

public ZonedDateTimeSerializer(DateTimeFormatter formatter) {
super(ZonedDateTime.class, dt -> dt.toInstant().toEpochMilli(),
ZonedDateTime::toEpochSecond, ZonedDateTime::getNano,
// ISO_ZONED_DATE_TIME is not the ISO format, it is an extension of it
DateTimeFormatter.ISO_OFFSET_DATE_TIME);
ZonedDateTime::toEpochSecond, ZonedDateTime::getNano,
formatter);
}

protected ZonedDateTimeSerializer(ZonedDateTimeSerializer base,
private ZonedDateTimeSerializer(ZonedDateTimeSerializer base,
Boolean useTimestamp, DateTimeFormatter formatter) {
super(base, useTimestamp, formatter);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
package com.fasterxml.jackson.datatype.jsr310;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.datatype.jsr310.ser.ZonedDateTimeSerializer;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;

import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Collection;

import static org.junit.Assert.assertThat;
import static org.junit.internal.matchers.StringContains.containsString;

@RunWith(Parameterized.class)
public class TestZonedDateTimeSerializationWithCustomFormatter {
private final DateTimeFormatter formatter;

public TestZonedDateTimeSerializationWithCustomFormatter(DateTimeFormatter formatter) {
this.formatter = formatter;
}

@Test
public void testSerialization() throws Exception {
ZonedDateTime zonedDateTime = ZonedDateTime.now();
assertThat(serializeWith(zonedDateTime, formatter), containsString(zonedDateTime.format(formatter)));
}

private String serializeWith(ZonedDateTime zonedDateTime, DateTimeFormatter formatter) throws Exception {
ObjectMapper mapper = new ObjectMapper().registerModule(new SimpleModule().addSerializer(
new ZonedDateTimeSerializer(formatter)));
mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
return mapper.writeValueAsString(zonedDateTime);
}

@Parameters
public static Collection<Object[]> customFormatters() {
Collection<Object[]> formatters = new ArrayList<>();
formatters.add(new Object[]{DateTimeFormatter.ISO_ZONED_DATE_TIME});
formatters.add(new Object[]{DateTimeFormatter.ISO_OFFSET_DATE_TIME});
formatters.add(new Object[]{DateTimeFormatter.ISO_LOCAL_DATE_TIME});
formatters.add(new Object[]{DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSZ")});
return formatters;
}
}