真没想到,Springboot能这样做全局日期格式化,有点香!
说在前边
最近部门几位同事受了一些委屈相继离职,共事三年临别之际颇有不舍,待一切手续办妥帖,寒暄过后送他们出公司,几个老哥临别时冲我鬼魅一笑,我顿时心里一紧有种不好的预感,这事绝对没有这么简单。等我接手这几个大佬的项目后,应验了我的预感,此刻我居然有点后悔,为啥送别之时没揍他们一顿!哈哈哈~ 而这种打人的冲动,在我开始优化几位老哥的项目时候,变得越来越强烈。
有个坑
技术部每个月都会组织一下代码走查及优化,以前是各自审查优化自己的项目,如今几位老哥的离职他们的项目就落到了我的头上。对于程序员来说最痛苦的事情就是接手别人的项目,还要做优化改造,因为这一点也不比重构一遍项目简单。不过,军令在前,没办法硬着头皮上吧!
第一个优化的点就让我有点崩溃,这几个大佬的技能能力很强,一直都是我学习的榜样,但在项目里几乎所有的日期格式化都这样用 SimpleDateFormat
,像如下代码这样实现,emm~ ,受过伤的男人怎么啥事都做的出来,哈哈哈~
SvcOrderDailyStatisticsPo orderDailyStatisticsPo = new SvcOrderDailyStatisticsPo(); SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); Date stationTime = dateFormat.parse(dateFormat.format(svcWorkOrderPo.getPayEndTime())); orderDailyStatisticsPo.setStatisticalDate(stationTime);
而且项目中的时间和日期API用的也比较混乱,考虑到 java.util.Date
和 java.util.Calendar
不支持时区,且非线程安全,对于日期的计算相对繁琐,技术部一致要求用JDK1.8以后的 java.time
LocalDateTime
。但不少人还是在用 java.util.Date
和 java.util.Calendar
处理日期。
优化方案
时间格式化是使用频率非常高的,如何让时间格式化变得既简单又不用重复造轮子,那么就应将它抽象出来,作为全局的日期格式化处理,下面就结合实践简单介绍下几种优化方案。
测试地址:http://127.0.0.1:8080/timeTest
@GetMapping("/timeTest") public OrderInfo timeTest() { OrderInfo order = new OrderInfo(); order.setCreateTime(LocalDateTime.now()); order.setUpdateTime(new Date()); return order; }
1、@JsonFormat注解
使用@JsonFormat
注解格式化时间,应该算是一个基本操作了,大部分开发者都应用此种方式,简单方便。
/** * @Author: xiaofu * @Description: */ public class OrderInfo { @JsonFormat(locale = "zh", timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") private LocalDateTime createTime; @JsonFormat(locale = "zh", timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") private Date updateTime; public LocalDateTime getCreateTime() { return createTime; } public void setCreateTime(LocalDateTime createTime) { this.createTime = createTime; } public Date getUpdateTime() { return updateTime; } public void setUpdateTime(Date updateTime) { this.updateTime = updateTime; } }
测试一下结果,发现 Date
类型和 LocalDateTime
类型都格式化成功,但还是有个问题,这样做仍然比较繁琐,每个实体类的日期字段都要加@JsonFormat
注解,重复的工作量也不小。接着往下看~
2、全局配置 (1)
Springboot
已经为我们提供了日期格式化 ${spring.jackson.date-format:yyyy-MM-dd HH:mm:ss}
,这里我们需要进行全局配置,配置比较简单,也无需在实体类属性上添加@JsonFormat
注解。
/** * @Author: xiaofu * @Description: */ public class OrderInfo { //@JsonFormat(locale = "zh", timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") private LocalDateTime createTime; //@JsonFormat(locale = "zh", timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") private Date updateTime; public LocalDateTime getCreateTime() { return createTime; } public void setCreateTime(LocalDateTime createTime) { this.createTime = createTime; } public Date getUpdateTime() { return updateTime; } public void setUpdateTime(Date updateTime) { this.updateTime = updateTime; } }
只需要用@Configuration
定义一个配置类,注入两个Bean
即可完成全局日期格式化处理,这种方式也是当前我项目中正在用的方式。
/** * @Author: xiaofu * @Description: */ @Configuration public class LocalDateTimeSerializerConfig { @Value("${spring.jackson.date-format:yyyy-MM-dd HH:mm:ss}") private String pattern; @Bean public LocalDateTimeSerializer localDateTimeDeserializer() { return new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(pattern)); } @Bean public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() { return builder -> builder.serializerByType(LocalDateTime.class, localDateTimeDeserializer()); } }
这种方式可支持 Date
类型和 LocalDateTime
类型并存,那么有一个问题就是现在全局时间格式是yyyy-MM-dd HH:mm:ss
,但有的字段却需要yyyy-MM-dd
格式咋整?
那就需要配合@JsonFormat
注解使用,在特定的字段属性添加@JsonFormat
注解即可,因为@JsonFormat
注解优先级比较高,会以@JsonFormat
注解标注的时间格式为主。
3、全局配置 (2)
这种全局配置的实现方式与上边的效果是一样的,不过,要注意的是使用这种配置后,字段手动配置@JsonFormat
注解将不再生效。
/** * @Author: xiaofu * @Description: */ public class OrderInfo { //@JsonFormat(locale = "zh", timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") private LocalDateTime createTime; //@JsonFormat(locale = "zh", timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") private Date updateTime; public LocalDateTime getCreateTime() { return createTime; } public void setCreateTime(LocalDateTime createTime) { this.createTime = createTime; } public Date getUpdateTime() { return updateTime; } public void setUpdateTime(Date updateTime) { this.updateTime = updateTime; } }
/** * @Author: xiaofu * @Description: */ @Configuration public class LocalDateTimeSerializerConfig { @Value("${spring.jackson.date-format:yyyy-MM-dd HH:mm:ss}") private String pattern; @Bean @Primary public ObjectMapper serializingObjectMapper() { ObjectMapper objectMapper = new ObjectMapper(); JavaTimeModule javaTimeModule = new JavaTimeModule(); javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer()); javaTimeModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer()); objectMapper.registerModule(javaTimeModule); return objectMapper; } public class LocalDateTimeSerializer extends JsonSerializer<LocalDateTime> { @Override public void serialize(LocalDateTime value, JsonGenerator gen, SerializerProvider serializers) throws IOException { gen.writeString(value.format(ofPattern(pattern))); } } public class LocalDateTimeDeserializer extends JsonDeserializer<LocalDateTime> { @Override public LocalDateTime deserialize(JsonParser p, DeserializationContext deserializationContext) throws IOException { return LocalDateTime.parse(p.getValueAsString(), ofPattern(pattern)); } } }
总结
分享了一个Springboot
项目开发过程中的一个小技巧,也顺便吐槽一下项目优化中遇到的坑,优化别的人的代码虽然是一件比较痛苦的事情,但在这个过程中确实能学习到很多技巧,对个人的技能提升也是很有帮助,因为都是些能够实实在在提高开发效率的干货。
小福利:
获取到一些极客课程 ,嘘~,免费 送给小伙伴们。关注公号回【极客】自行领取
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
如何加快您的Joomla网站速度
如果您使用了Joomla来构建自己的网站,一旦安装和配置完毕,您就会意识到它似乎运行缓慢。我们了解到,缓慢的加载时间不仅会使您感到沮丧。网站速度之所以重要,有多种原因。更快的网站将为您的客户和访客提供更好的体验,从而减少反弹。效果不佳可能会影响您网站的搜索排名。 在尝试确定Joomla构建网站时,需要考虑一些事项!网站运行缓慢。以下是提高网站速度的常用方法: 网站服务器虽然可以采取多种措施来提高网站的性能,但这种方法有其局限性。调整CMS仅有助于优化站点性能。低质量的主机以低廉的价格吸引了消费者,但是运行速度却令人难以接受。您只能通过在经过验证的可信任且非常有效的Web主机上进行研究来避免这种情况。 PHP 7PHP 7.3最容易识别的优势是您的Joomla!与旧的PHP版本相比,代码会更快。PHP 7.3版本比以前的版本更快。基准测试表明,与PHP 7.0相比,脚本处理速度提高了约22%,与PHP 7.2相比,提高了约7%。因此,请检查您的托管面板或咨询托管支持人员如何切换到新版本的PHP。确保您在实时站点上使用的所有插件,模块和组件都与PHP 7兼容。 更多内存空间您可能需要增加内...
- 下一篇
DataQL 4.1.3 发布,支持 SQL 执行,从此告别 Mapper、BO、VO、DO、DAO
新增 新增 Dataway 框架 dataway 通过数据库探测机制来实现确定 SQL 执行方案。 DataQL 增加可以构建多个独立的环境。其中 dataway 使用独立的环境。 DataQL 新增 SQL 代码片段执行器,开启 DataQL + SQL 模式。支持分页模式,并兼容多种数据库。 CorsFilter web框架增加一个跨域的 Filter 工具类。 DataQL-fxDataQL FragmentProcess 接口新增批量处理能力。 DataQL-fx增加完成事物函数库,完整支持 7种事务传播属性。 DataQL-fx增加 web 相关的 函数库 DataQL-fx增加 加密解密 udf 工具。 优化 DataQL 语法解析器新增支持 标识符可以通过 `` 来囊括特殊字符例如:+、-、*、/ 等符号 DataQL QueryApiBinder 的 bindFinder 支持 Supplier了。 修复 ApiBinderCreater 拼写错误 ApiBinderCreator。 2.mapjoin 函数名改为 mapJoin。 修复 Hasor-web:Invok...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- CentOS关闭SELinux安全模块
- CentOS7设置SWAP分区,小内存服务器的救世主
- Docker安装Oracle12C,快速搭建Oracle学习环境
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库