使用Jackson将LocalDateTime序列化为仅带毫秒的格式

3

我想将LocalDateTime序列化为文本格式,仅显示毫秒。 我尝试了以下示例:

final ObjectMapper mapper = new ObjectMapper();

mapper.registerModule(new Jdk8Module());
mapper.registerModule(new JavaTimeModule());
mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
mapper.disable(SerializationFeature.WRITE_DATE_TIMESTAMPS_AS_NANOSECONDS);

final LocalDateTime t = LocalDateTime.of(2014, 3, 30, 12, 30, 23, 123456789);

System.out.println(mapper.writeValueAsString(t));

这将输出:
"2014-03-30T12:30:23.123456789"

所以,精度仍然是纳秒级别的,尽管不会显示它们,这是因为使用了mapper.disable(SerializationFeature.WRITE_DATE_TIMESTAMPS_AS_NANOSECONDS)

我的期望是:

"2014-03-30T12:30:23.123"

为什么会出现这种情况?我该如何解决?

我目前正在使用Jackson的2.9.8版本。 - TheBrizzler
1个回答

4

由于您禁用了WRITE_DATES_AS_TIMESTAMPS,启用或禁用WRITE_DATE_TIMESTAMPS_AS_NANOSECONDS不起任何作用,因为localDateTime不再处于时间戳表示中。

如果您启用WRITE_DATES_AS_TIMESTAMPS,然后禁用WRITE_DATE_TIMESTAMPS_AS_NANOSECONDS,您将获得所需的结果,但以另一种形式呈现([2014, 3, 30, 12, 30, 23, 123]),因此这也不是一个选择。

因此,基本上只有两种选择来实现预期的结果:

  1. The easiest - use this: System.out.println(mapper.writeValueAsString(t.truncatedTo(ChronoUnit.MILLIS)));

    (Remember that you can safely remove mapper.disable(SerializationFeature.WRITE_DATE_TIMESTAMPS_AS_NANOSECONDS);, as it does nothing in this case).

  2. A more complicated way (without truncating the time):

    DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS");
    SimpleModule simpleModule = new SimpleModule();
    simpleModule.addSerializer(new LocalDateTimeSerializer(dateTimeFormatter));
    
    final ObjectMapper mapper = new ObjectMapper();
    mapper.registerModule(simpleModule);
    
    final LocalDateTime t = LocalDateTime.of(2014, 3, 30, 12, 30, 23, 123456789);
    
    System.out.println(mapper.writeValueAsString(t));
    

    (In that case you don't even need to use JavaTimeModule).


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接