![f957db7ab11012412408c860bccce180.png](https://i-blog.csdnimg.cn/blog_migrate/e5542e710d0702e3c0dcdae48e49b663.jpeg)
java数据格式使用越来越普遍,在开发过程中经常会用到对象转json格式,阿里的开源项目fastjson是最流行的序列化和反序列化的工具。最近在用fastjson转化日期对象为json格式的时候,发现跟期想的不一样,日期转化之后竟然是时间戳!
Date now=new Date();String jsonDateStr=JSON.toJSONString(now);System.out.println(jsonDateStr);控制台输出 1567432087459
一般我们会把日期对象转化成json字符串,通过流传到前端页面显示。但是这里转化过去是个时间戳,显然不是我们想要的,到前端页面还是经过转化成易于读取的YYYY-mm-dd hh:mm:ss 格式,仔细想想阿里的大牛不会这一点都没有想到,使用起来这么不方便。怀着好奇得到心态,看了一遍fastjson的源码,心里的疑惑逐渐解开了。同时又发现了好很多好用的方法。
![2636a295da88e1d33f70c90aa70466bb.png](https://i-blog.csdnimg.cn/blog_migrate/f7a92b5ce40e2d8e9b3fe5207d7589c3.jpeg)
fastjson针对每一个类型都有一个对应的处理类,比如长整型Long 有对应的LongCodec处理,普通bean对用JavaBeanSerializer,日期Date对象用DateCodec处理。打开DateCodec可以看到
if (out.isEnabled(SerializerFeature.WriteDateUseDateFormat)) { DateFormat format = serializer.getDateFormat(); if (format == null) { format = new SimpleDateFormat(JSON.DEFFAULT_DATE_FORMAT, serializer.locale); ((DateFormat)format).setTimeZone(serializer.timeZone); } String text = ((DateFormat)format).format(date); out.writeString(text);
long time = date.getTime(); out.writeLong(time);
也就是我们如果加上参数SerializerFeature.WriteDateUseDateFormat 那么就会按照标准格式输出,否则会转化成时间戳。
我们把测试的方法改造
Date now=new Date();String jsonDateStr=JSON.toJSONString(now,SerializerFeature.WriteDateUseDateFormat);System.out.println(jsonDateStr);输出"2019-09-02 22:29:14"
如果我们想自定义格式 比如输出 YYYY-MM-dd HH:mm
则可以用 toJSONStringWithDateFormat(Object object, String dateFormat, SerializerFeature... features)
Date now=new Date(); String jsonDateStr=JSON.toJSONStringWithDateFormat(now,"YYYY-MM-dd HH:mm