fastjson 序列化LocalDateTime时,nanoOfSecond为0时,序列化格式不同

wmvff8tz  于 2021-11-27  发布在  Java
关注(0)|答案(5)|浏览(413)

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

htrmnn0y

htrmnn0y2#

我也没看懂,什么问题。

pbgvytdp

pbgvytdp3#

有问题,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

r7knjye2

r7knjye24#

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

kx7yvsdv

kx7yvsdv5#

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);

建议这样写

相关问题