Date类型转换指定格式-------关于Date类型指定格式踩的坑,也可能是更大的坑,希望有大佬指示一下

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")则可以实现映射关系。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值