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

本文详细介绍了前后端如何处理时间格式,包括使用@DateTimeFormat、@JsonFormat和@JSONField等注解,确保时间数据在不同环境下的正确传输与显示。探讨了不同注解的应用场景及相互配合使用的方法。

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小时制

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值