Spring 日期时间处理
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
这个类,关键看两个成员变量jackson2Present
跟gsonPresent
,这是两个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 参考
- http://docs.spring.io/spring/docs/4.3.8.RELEASE/spring-framework-reference/html/validation.html#format-CustomFormatAnnotations
- http://docs.spring.io/spring/docs/4.3.8.RELEASE/spring-framework-reference/html/validation.html#core-convert-ConversionService-API
- http://docs.spring.io/spring/docs/4.3.8.RELEASE/spring-framework-reference/html/mvc.html#mvc-config-conversion
- http://docs.spring.io/spring/docs/4.3.8.RELEASE/spring-framework-reference/html/mvc.html#mvc-config-message-converters
Spring 日期时间处理的更多相关文章
- Springboot 关于日期时间格式化处理方式总结
项目中使用LocalDateTime系列作为DTO中时间的数据类型,但是SpringMVC收到参数后总报错,为了配置全局时间类型转换,尝试了如下处理方式. 注:本文基于Springboot2.x测试, ...
- MySQL 日期时间类型怎么选?千万不要乱用!
构建数据库写程序避免不了使用日期和时间,对于数据库来说,有多种日期时间字段可供选择,如 timestamp 和 datetime 以及使用 int 来存储 unix timestamp. 不仅新手,包 ...
- 全网最全!彻底弄透Java处理GMT/UTC日期时间
目录 前言 本文提纲 版本约定 正文 Date类型实现 时区/偏移量TimeZone 设置默认时区 让人恼火的夏令时 Date时区无关性 读取字符串为Date类型 SimpleDateFormat格式 ...
- 一文告诉你Java日期时间API到底有多烂
前言 你好,我是A哥(YourBatman). 好看的代码,千篇一律!难看的代码,卧槽卧槽~其实没有什么代码是"史上最烂"的,要有也只有"史上更烂". 日期是商 ...
- JAVA中计算两个日期时间的差值竟然也有这么多门道
上半年春招的时候,作为面试官,对于面试表现的不错的同学会要求其写一小段代码看看.题目很简单: 给定一个日期,然后计算下距离今天相差的天数. 本以为这么个问题就是用来活跃面试氛围的,但是结果却让人大跌眼 ...
- EasyUI datagrid 日期时间格式化
EasyUI datagrid中显示日期时间时,会显示为以下不太直观的数值: 添加以下JavaScript脚本,然后在field中添加 formatter: DateTimeFormatter 即可. ...
- POCO库——Foundation组件之日期时间DateTime
日期时间DateTime:内部提供多个设计计时器.日期.时区.时间戳等: Clock.h :Clock时钟计时类,_clock:Int64类型时钟值,CLOCKVAL_MIN.CLOCKVAL_MAX ...
- db2 日期时间格式
db2日期和时间常用汇总 1.db2可以通过SYSIBM.SYSDUMMY1.SYSIBM.DUAL获取寄存器中的值,也可以通过VALUES关键字获取寄存器中的值. SELECT 'HELLO DB2 ...
- Angularjs在控制器(controller.js)的js代码中使用过滤器($filter)格式化日期/时间实例
Angularjs内置的过滤器(filter)为我们的数据信息格式化提供了比较强大的功能,比如:格式化时间,日期.格式化数字精度.语言本地化.格式化货币等等.但这些过滤器一般都是在VIEW中使用的,比 ...
随机推荐
- 一步步教你使用rem适配不同屏幕的移动设备
1.先说说几个前端常用的几个单位的概论: 1.px (pixel,像素):是一个虚拟长度单位,是计算机系统的数字化图像长度单位,如果px要换算成物理长度,需要指定精度DPI(Dots Per Inch ...
- zabbix 监控 tomcat jmx
zabbix_server: zabbix_server.conf : # Add JavaGateway=127.0.0.1 JavaGatewayPort=10052 StartJavaPolle ...
- 在多个Activity中回传值(startActivityForResult())
业务逻辑: MainActivity打开A,A打开B,B把值传回MainActivity.适用在多个Activity中回传值. 实例:微信中选择国家-->省份-->城市的实现 实现方式分析 ...
- Java 9 尝鲜之JShell交互式编程环境
JShell--Java 9 的交互式编程环境 本文要求读者有基本的 Java 知识. Tips Java 9 的代码由于提供了新特性,所以有些代码并不支持向后兼容.也就是说,用 Java 9 写的代 ...
- java 基础知识二 基本类型与运算符
java 基础知识二 基本类型与运算符 1.标识符 定义:为类.方法.变量起的名称 由大小写字母.数字.下划线(_)和美元符号($)组成,同时不能以数字开头 2.关键字 java语言保留特殊含义或者 ...
- css常用技巧集合
1 不想让按钮touch时有蓝色的边框或半透明灰色遮罩(根据系统而定) /*解决方式一*/ -webkit-tap-highlight-color:rgba(0,0,0,0); -webkit-use ...
- Spring+SpringMVC+MyBatis+easyUI整合优化篇(九)数据层优化-jdbc连接池简述、druid简介
日常啰嗦 终于回到既定轨道上了,这一篇讲讲数据库连接池的相关知识,线程池以后有机会再结合项目单独写篇文章(自己给自己挖坑,不知道什么时候能填上),从这一篇文章开始到本阶段结束的文章都会围绕数据库和da ...
- sql中的复制函数REPLICATE
REPLICATE函数: REPLICATE(字符串,次数)复制一个字符串n次 ) --输出结果:0000000000
- windows下使用wineshark分析抓取本地回环包
## 摘要 由于windows系统没有提供本地回环网络的接口,用Wireshark监控网络的话看不到localhost的流量. 想要获取本地的网络数据包,可以通过一款小巧的开源软件RawCap来进行抓 ...
- 读《effective C++》1
条款一:视C++为一个语言联邦 学习C++半个月了,学了他的面向过程编程,面向对象编程(封装性,继承性,多态性),template泛型编程,开始只是觉得C++基础是面向对象,但是学了这么多块开始有点迷 ...