[alibaba/fastjson]序列化LocalDateTime时,nanoOfSecond为0时,序列化格式不同

2025-11-11 462 views
7

nanoOfSecond为0时: LocalDateTime localDateTime = LocalDateTime.of(2018, 8, 31, 15, 26, 37, 0); JSON.toJSONString(localDateTime);//2018-08-31 15:26:37 localDateTime.toString();//2018-08-31T15:26:37

nanoOfSecond不为0时: LocalDateTime localDateTime = LocalDateTime.of(2018, 8, 31, 15, 26, 37, 1); JSON.toJSONString(localDateTime).toString();//2018-08-31T15:26:37.000000001 localDateTime.toString();//2018-08-31T15:26:37.000000001

回答

8

有问题么?

5

我也没看懂,什么问题。

7

有问题,Jdk8DateCodec类中判断了,如果LocalDateTime类型,getNano() == 0的话是使用的 DEFFAULT_DATE_FORMAT 或者配置的format, 否则使用的是LocalDateTime自己的toString()方法。 但是DEFFAULT_DATE_FORMAT 序列化出的日期和时间中间不带“T”。 这带来的后果是,mysql数据库,datetime, datetime(3)类型的字段序列化出的格式不一致, 而IE浏览器的不支持new Date("2017-10-01 12:12:12") 这种格式,IE要求时间字符串中间必须带T @kimmking @wenshao

3

还有这个问题在 1.2.11版中是不存在,因为Jdk8DateCodec.write 方法对所有类型都是调用 toString() 方法来序列化,但是为什么后续版本对LocalDateTime 类型进行了特殊判断,结果就造成了格式不一致的问题,求解?

7
LocalDateTime localDateTime = LocalDateTime.of(2018, 8, 31, 15, 26, 37, 1);
String json = JSON.toJSONStringWithDateFormat(localDateTime, "yyyy-MM-dd HH:mm:ss");//2018-08-31T15:26:37.000000001
assertEquals("\"2018-08-31 15:26:37\"", json);

建议这样写