1 package com.fasterxml.jackson.datatype.jsr310.ser.key;
2
3 import java.io.IOException;
4 import java.time.ZonedDateTime;
5 import java.time.format.DateTimeFormatter;
6
7 import com.fasterxml.jackson.core.JsonGenerator;
8 import com.fasterxml.jackson.core.JsonProcessingException;
9 import com.fasterxml.jackson.databind.JsonSerializer;
10 import com.fasterxml.jackson.databind.SerializationFeature;
11 import com.fasterxml.jackson.databind.SerializerProvider;
12 import com.fasterxml.jackson.datatype.jsr310.DecimalUtils;
13
14 public class ZonedDateTimeKeySerializer extends JsonSerializer<ZonedDateTime> {
15
16 public static final ZonedDateTimeKeySerializer INSTANCE = new ZonedDateTimeKeySerializer();
17
18 private ZonedDateTimeKeySerializer() {
19
20 }
21
22 @Override
23 public void serialize(ZonedDateTime value, JsonGenerator gen, SerializerProvider serializers) throws IOException,
24 JsonProcessingException {
25
28 if (serializers.isEnabled(SerializationFeature.WRITE_DATES_WITH_ZONE_ID)) {
29 gen.writeFieldName(DateTimeFormatter.ISO_ZONED_DATE_TIME.format(value));
30 } else if (useTimestamps(serializers)) {
31 if (useNanos(serializers)) {
32 gen.writeFieldName(DecimalUtils.toBigDecimal(value.toEpochSecond(), value.getNano()).toString());
33 } else {
34 gen.writeFieldName(String.valueOf(value.toInstant().toEpochMilli()));
35 }
36 } else {
37 gen.writeFieldName(DateTimeFormatter.ISO_OFFSET_DATE_TIME.format(value));
38 }
39 }
40
41 private static boolean useNanos(SerializerProvider serializers) {
42 return serializers.isEnabled(SerializationFeature.WRITE_DATE_TIMESTAMPS_AS_NANOSECONDS);
43 }
44
45 private static boolean useTimestamps(SerializerProvider serializers) {
46 return serializers.isEnabled(SerializationFeature.WRITE_DATE_KEYS_AS_TIMESTAMPS);
47 }
48
49 }
50