1 Spring自身的支持

1.1 factory-bean

<bean id="dateFormat" class="java.text.SimpleDateFormat">
<constructor-arg value="yyyy-MM-dd" />
</bean>
<bean id="user" class="zxy.demo.springmvc.domain.UserInfo">
<constructor-arg value="10" />
<constructor-arg index="1" value="名字" />
<constructor-arg index="2">
<bean factory-bean="dateFormat" factory-method="parse">
<constructor-arg value="2016-12-19" />
</bean>
</constructor-arg>
</bean>

作用于单个实体,用于xml文件配置。

1.2 DateTimeFormat

这是一个注解,完整类名是org.springframework.format.annotation.DateTimeFormat,用于http请求入参,只能作用于具体的实体对象,如下

@DateTimeFormat(pattern="yyyy-MM-dd")

1.3 InitBinder

只用于http请求入参,作用于全局,可搭配@Controller@ControllerAdvice使用,如下

@ControllerAdvice
public class MyControllerAdvice {
@InitBinder
public void initDate(WebDataBinder binder) {
// SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH");
// dateFormat.setLenient(false);
// binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, false));
binder.addCustomFormatter(new DateFormatter("yyyy-MM-dd")); // Spring 4.2之后的写法
}
}

1.4 conversion-service

<bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
<property name="converters">
<set>
<bean class="zxy.demo.springmvc.converter.DateConverter"/>
</set>
</property>
</bean> <mvc:annotation-driven conversion-service="conversionService"/>
public class DateConverter implements Converter<String, Date> {
@Override
public Date convert(String source) {
// ...
}
}

DateConverter是一个自定义类,实现接口org.springframework.core.convert.converter.Converter,重写convert()方法即可。作用于全局,用于http请求入参


2 说明

前面说的日期处理,没有一种是用于请求返回的,如果是要返回数据,并且使用json进行系列化的,那么SpringMVC支持的有jackson跟Gson,具体要看引入了哪个jar包,如果两个引入了,那么将以jackson为准,具体可看org.springframework.web.servlet.config.AnnotationDrivenBeanDefinitionParser这个类,关键看两个成员变量jackson2PresentgsonPresent,这是两个boolean值,根据这两个成员变量看关联的代码即可。

:由于一般接口返回的数据是json格式的,所以jackson跟Gson这两个包肯定是要引入一个的,不然请求会报错,如“org.springframework.core.convert.ConversionFailedException: Failed to convert from type xxx to type xxx for ...”,这时候引入两个包之中的一个就可以让对象序列化为Json进行传输了。同理xml格式的序列化也可参考AnnotationDrivenBeanDefinitionParser这个类进行相应的配置。

:下面的代码是基于Spring 4.3.8.RELEASE,其他版本应该也类似。


3 jackson

3.1 JsonFormat

这是一个注解,完整类名是com.fasterxml.jackson.annotation.JsonFormat,只能用于http请求返回,只能作用于具体的实体对象,如下

@JsonFormat(pattern = "yyyy-MM-dd HH:mm")

3.2 message-converters

作用于全局,只用于请求返回

<mvc:annotation-driven>
<mvc:message-converters>
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="objectMapper" >
<bean class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean" p:simpleDateFormat="yyyy-MM-dd HH:mm:ss" />
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>

4 Gson

4.1 message-converters

作用于全局,只用于请求返回

<mvc:annotation-driven>
<mvc:message-converters>
<bean class="org.springframework.http.converter.json.GsonHttpMessageConverter">
<property name="gson">
<bean class="org.springframework.http.converter.json.GsonFactoryBean" p:dateFormatPattern="yyyy-MM-dd HH:mm:ss" />
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>

5 最后

如果作用域单个的跟作用于全局的都配置了,那么配置单个实体的将最终生效而不会用全局的配置。

对于使用message-converters的方式,如果还需要更多的配置参数,可以看spring-webmvc的AnnotationDrivenBeanDefinitionParser这个类跟spring-web的org.springframework.http.converter.json包下的类即可。

更多的日期时间处理方式,可参考官方文档。


6 参考

Spring 日期时间处理的更多相关文章

  1. Springboot 关于日期时间格式化处理方式总结

    项目中使用LocalDateTime系列作为DTO中时间的数据类型,但是SpringMVC收到参数后总报错,为了配置全局时间类型转换,尝试了如下处理方式. 注:本文基于Springboot2.x测试, ...

  2. MySQL 日期时间类型怎么选?千万不要乱用!

    构建数据库写程序避免不了使用日期和时间,对于数据库来说,有多种日期时间字段可供选择,如 timestamp 和 datetime 以及使用 int 来存储 unix timestamp. 不仅新手,包 ...

  3. 全网最全!彻底弄透Java处理GMT/UTC日期时间

    目录 前言 本文提纲 版本约定 正文 Date类型实现 时区/偏移量TimeZone 设置默认时区 让人恼火的夏令时 Date时区无关性 读取字符串为Date类型 SimpleDateFormat格式 ...

  4. 一文告诉你Java日期时间API到底有多烂

    前言 你好,我是A哥(YourBatman). 好看的代码,千篇一律!难看的代码,卧槽卧槽~其实没有什么代码是"史上最烂"的,要有也只有"史上更烂". 日期是商 ...

  5. JAVA中计算两个日期时间的差值竟然也有这么多门道

    上半年春招的时候,作为面试官,对于面试表现的不错的同学会要求其写一小段代码看看.题目很简单: 给定一个日期,然后计算下距离今天相差的天数. 本以为这么个问题就是用来活跃面试氛围的,但是结果却让人大跌眼 ...

  6. EasyUI datagrid 日期时间格式化

    EasyUI datagrid中显示日期时间时,会显示为以下不太直观的数值: 添加以下JavaScript脚本,然后在field中添加 formatter: DateTimeFormatter 即可. ...

  7. POCO库——Foundation组件之日期时间DateTime

    日期时间DateTime:内部提供多个设计计时器.日期.时区.时间戳等: Clock.h :Clock时钟计时类,_clock:Int64类型时钟值,CLOCKVAL_MIN.CLOCKVAL_MAX ...

  8. db2 日期时间格式

    db2日期和时间常用汇总 1.db2可以通过SYSIBM.SYSDUMMY1.SYSIBM.DUAL获取寄存器中的值,也可以通过VALUES关键字获取寄存器中的值. SELECT 'HELLO DB2 ...

  9. Angularjs在控制器(controller.js)的js代码中使用过滤器($filter)格式化日期/时间实例

    Angularjs内置的过滤器(filter)为我们的数据信息格式化提供了比较强大的功能,比如:格式化时间,日期.格式化数字精度.语言本地化.格式化货币等等.但这些过滤器一般都是在VIEW中使用的,比 ...

随机推荐

  1. mvalidator手机端校验

    官网地址:https://github.com/efri-yang/mobileValidate#%E5%8F%82%E6%95%B0 使用方法: html如下: <li class=" ...

  2. unity3D插件开发——前篇

    Unity3D(以下简称Unity)是今年来非常流行的游戏开发引擎.他不仅有足够和unreal(虚幻)引擎媲美的渲染效果,足够多的平台输出,更为突出的就是Unity本身的编辑器.unity本身除了使用 ...

  3. 如何查看sql server端口号

    通过sql server配置管理器-->sql server网络配置-->选择-->通过右侧选择TCP/IP(已启用)-->查看属性 还可以通过sql语句查看: exec sy ...

  4. 使用关系型数据库作为Redis落地的思路

    Redis的持久化方式主要有2种:RDB和AOF,但各有不足,同时Redis没有SQL支持,Redis本身提供的命令不足以实现大多数SQL查询需求,对后期运营的分析需求支撑不足.此外,对于游戏来说,活 ...

  5. smartgit试用到期不用序列号怎么继续使用

    方法1 1:进入C盘,搜索SmartGit,出现\AppData\Roaming\syntevo: 2:进入文件7.1和8,这个有不同的版本可以使用,上次里面的setting.xml文件 3:重新打开 ...

  6. oracle的insert的时候&符号如何插入(转义)

    chr(38)替换& insert   into   table   values( 'http://localhost:8080/index.action?username=138& ...

  7. 【 js 基础 】 深浅拷贝

    underscore的源码中,有很多地方用到了 Array.prototype.slice() 方法,但是并没有传参,实际上只是为了返回数组的副本,例如 underscore 中 clone 的方法: ...

  8. javaScript 中String的常用方法

    1.length() 字符串的长度 例:char chars[]={'a','b'.'c'}; String s=new String(chars); int len=s.length(); 2.ch ...

  9. Java转型(向上转型和向下转型)

    在Java编程中经常碰到类型转换,对象类型转换主要包括向上转型和向下转型. 5.13.1 向上转型 我们在现实中常常这样说:这个人会唱歌.在这里,我们并不关心这个人是黑人还是白人,是成人还是小孩,也就 ...

  10. MapReduce处理流程

    MapReduce是Hadoop2.x的一个计算框架,利用分治的思想,将一个计算量很大的作业分给很多个任务,每个任务完成其中的一小部分,然后再将结果合并到一起.将任务分开处理的过程为map阶段,将每个 ...