public static void main(String[] args) {
Date date1 = new Date();
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//转换string类型
String format1 = format.format(date1);
String dateString = "2021-07-09 15:30:40";
try {
//转换date类型
Date date = format.parse(dateString);
System.out.println(date);
} catch (ParseException e) {
e.printStackTrace();
}
}
Date
对象的toString()
方法的默认格式是按照本地化设置进行输出的,因此会显示星期、月份、时区等信息,而不是简单的日期和时间。
因此就算指定格式也会按照ISO这个格式输出,2022-09-15T14:40:50.000+00:00(控制台是Fri Jul 09 15:30:40 CST 2021)
区别就是如果没有指定时分秒,那么时分秒就都显示00:00:00
想转换成指定格式输出能用string类型,转换完string类型再转换成date类型也没有用,还是会按照默认的date格式输出。
解决办法,要想保证返给前端的数据格式(目前了解到的只有这些):
*字段改成String类型,以字符串类型输出指定后的日期格式
*继续使用date类型,使用注解,加上@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone="GMT+8")注解,本质上也是把date类型的值转成json字符串
*前端去做时间处理
关于注解:
1.如果是DTO中的日期字段,如:private Date start;
应该加:
@JSONField(format = "yyyy-MM-dd HH:mm:ss")
如果加的是:@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone="GMT+8"),会出现问题:前端选择日期1.11,存到数据库发现是1.10,或者我只传日期,时间默认00:00:00,但存进去是08:00:00
2.如果是VO中的日期字段,如:private Date start;
应该加:
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone="GMT+8")
如果加的是:@JSONField(format = "yyyy-MM-dd HH:mm:ss")会出现问题:返回给前端页面显示的是:时间戳: 1645527428033
注意:此处必须有 timezone="GMT+8" ,否则显示出的时间会差几个小时,导致对不上
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")//前端传来的日期格式化
@JSONField(format = "yyyy-MM-dd HH:mm:ss")//后端传的日期格式化
两个注解在具体的项目中选择使用哪一个,通常取决于你使用的 JSON 库。如果使用 Jackson,就使用 @JsonFormat
;如果使用 Fastjson,就使用 @JSONField
。
3.@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")指定前端传的数据格式,一旦不是这个直接报错
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
从数据库获取时间传到前端进行展示的时候,我们有时候可能无法得到一个满意的时间格式的时间日期,在数据库中显示的是正确的时间格式,获取出来却变成了很丑的时间戳,@JsonFormat注解很好的解决了这个问题,我们通过使用@JsonFormat可以很好的解决:后台到前台时间格式保持一致的问题
@JSONField(format = "yyyy-MM-dd HH:mm:ss")
用法:目前最长的用属性是@JSONField(name="resType")和@JSONField(format="yyyy- MMdd")name:
Usage: Currently the longest used attributes are @JSONField(name="resType") and @JSONField(format="yyyy-MMdd")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.
总结注解@JsonFormat主要是后台到前台的时间格式的转换注解@DataTimeFormat主要是前后到后台的时间格式的转换注解@JSONField主要用在java反序列化时进行属性的匹配。
例如数据里key是name,实体类是userName,则使用@JSONField(name="name")则可以实现映射关系。