阅读 331

关于日期乱码问题,解决办法JsonFormat和DateTimeFormat和@JSONField

这是我参与8月更文挑战的第1天,活动详情查看:8月更文挑战

1.@DateTimeFormat

作用:接受前台的时间格式,传到后台的格式

方法一:在类属性上添加

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

@DateTimeFormat是Spring的注解,作用是限制前端传入的时间格式,如果格式不匹配,则会抛出异常,可以理解成一种格式限制,不加该注解,Spring也会将前端传入的时间字符串解析成Date类型

方法二:创建一个类型转换的类

public class DateHandler implements Converter<String, Date>{  
  
	@Override    
	public Date convert(String source) {        
		Date date = null;        
		try {if(source.indexOf("-")>0){                
			date = new SimpleDateFormat("yyyy-MM-dd").parse(source);            
				}        
			} catch (ParseException e) {
			e.printStackTrace();        
			}        
		return date;    
	} 
}
复制代码

2.@JsonFormat

@JsonFormat(pattern="yyyy-MM-dd",timezone="GMT+8")

@JsonFormat 默认是标准时区的时间,多出现少8小时的情况 使用时,按需求加上时区 北京时间 东八区 timezone=”GMT+8” 作用:后台的时间格式化,发送到前台

3.@JSONField

@JSONField(format=”yyyy-MM-dd”)

@JSONField是fastjson的注解,主要进行==JSON解析==和==序列化==,作用是将日期按照指定的格式,格式化为字符串,返回给前端

目前最常的用属性是@JSONField(name=”resType”)和 @JSONField(format=”yyyy-MM-dd”)

name:@JSONField(name=”resType”)主要用于指定前端传到后台时对应的key值,如果bean中没有这个注解,则默认前端传过来的key是field本身,即如果是private String name,name前端对应的key就是name才能对应上。

format :@JSONField(format=”yyyy-MM-dd”)主要用于格式化日期,比如前台传过来的时间是2018-07-12 17:44:08,但是通过这个注解,你存到数据库的时间就是2018-07-12 00:00:00.

4 应用场景记录

场景一

1 应用说明

前端参数传递时间字符串,如 beginTime="2018-07-12",后台用Date类型接受参数.且可用POST请求接受参数,也可用GET请求接受参数.

POST请求:请求体传递参数 GET请求:地址栏拼接传参

2 使用尝试

单独使用@JSONField(format = "yyyy-MM")

  • POST请求没有问题
  • GET请求报错,反馈,类型转换异常(String -> Date)

3 解决办法

经过尝试, @DateTimeFormat(pattern = "yyyy-MM") @JSONField(format = "yyyy-MM") 同时使用上面两个注解,POST请求和GET请求,均可实现.

4 不解之谜???

1 单独使用 @DateTimeFormat(pattern = "yyyy-MM") 会报错,查阅资料后,发现该注解没有年月的格式,只有年月日的格式,所以报错,即该注解不可单独使用. 2 上面两个注解同时使用为什么没有报错,即@DateTimeFormat(pattern = "yyyy-MM")该注解可以使用,且没有问题

==上面问题,暂时没有答案,后续有答案再行补充!!!==

附录: 时间模式字符串用来指定时间格式

字母描述示例
G纪元标记AD
y四位年份2001
M月份July or 07
d一个月的日期10
hA.M./P.M. (1~12)格式小时12
H一天中的小时 (0~23)22
m分钟数30
s秒数55
S毫秒数234
E星期几Tuesday
D一年中的日子360
F一个月中第几周的周几2 (second Wed. in July)
w一年中第几周40
W一个月中第几周1
aA.M./P.M. 标记PM
k一天中的小时(1~24)24
KA.M./P.M. (0~11)格式小时10
z时区Eastern Standard Time
'文字定界符Delimiter
"单引号

如: yyyy.MM.dd HH:mm:ss 表示24小时制 yyyy.MM.dd hh:mm:ss 表示12小时制

文章分类
后端
文章标签