关于JavaDate数据返回到前端变数字的问题

Posted 汪神

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于JavaDate数据返回到前端变数字的问题相关的知识,希望对你有一定的参考价值。

不知道为什么,前端显示的所有数据项都没有错,就只有时间那一项很奇怪,是一串数字,而且这个数字在数据库怎么都找不到……

然后我在后端从service到controller都debug了一遍,发现数据都没有错,拿的都是时间啊。

后来百度知道,原来后台在返回json数据的时候,用自身的序列化机制会把时间变成一段很长的数字,就像上面的显示一样。

 

然后这里就要用到一个东西:

@JsonFormat,它的作用是,出参时,自动把Date型对象数据转化成正确的格式化后的字符串出去

 

效果:

 

然后又通过度娘知道,还有个注解

@DateTimeFormat

这个是用于将前台传到后台字符串变量转换为Date类型。请求报文只需要传入yyyymmddhhmmss字符串进来,则自动转换为Date类型数据。(不过好像前端要传的是json)

这里也有个小例子:

前端只传了一个 格式正确的  时间字符串

layer.open({
        type : 2,
        title : \'归档详情\',
        //btn: [\'选中\', \'取消\'],
        shade : false,
        area : [ \'900px\', \'600px\' ],
        maxmin : true,
        content : gateUrl.UiUrl + \'/productbaseEdition?eTime=\'
                + edition.table.bootstrapTable(\'getSelections\')[0].eTime,// 这里content是一个URL,如果你不想让iframe出现滚动条,你还可以content:[\'http://sentsin.com\', \'no\']
        end : function() {

        }
});

这里就只是在请求url那里拼接了一个  eTime上去。

然后后台一开始直接用Date接,毫无疑问,无法成功,然后就用了这个@DateTimeFormat

看后端代码:

@Controller
@RequestMapping("")
public class ProductbaseEditionController extends BaseController {
    
    @GetMapping("/productbaseEdition")
    public String productbaseEdition(@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")Date eTime) {
        System.out.println("#################test   time:"+eTime);
        return "productbaseEdition/list";
    }
}

接收成功!(这里不是json数据,然后用注解@JsonFormat似乎不能成功接收)

 

不过也有资料说,@JsonFormat不仅可以完成后台到前台参数传递的类型转换,还可以实现前台到后台类型转换。当content-type为application/json时,优先使用@JsonFormat的pattern进行类型转换。而不会使用@DateTimeFormat进行类型转换。

 

然后我也根据这个做了几个实验,

@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
//@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
private Date eTime;//归档时间,也是归档的版本号

这是实体里面的一个属性,前端传用json传数据过来,然后Controller用这个实体来接收

                 var data = {};
            data.id = edition.currentItem.id;
            data.eTime = edition.currentItem.eTime;
            layer.confirm(\'确定删除这个归档版本吗?\', null, function (index) {
                
                $.ajax({
                    url: edition.baseUrl + "/editionDelete",
                    type: "POST",
                    data:JSON.stringify(data),
                    headers : {  
                        \'Content-Type\' : \'application/json;charset=utf-8\'  
                    },
                    success: function (data) {
                        console.log(data);
                        if (data.code == \'0\') {
                            layerTips.msg("删除成功!");
                            edition.refresh();
                        } else {
                            layerTips.msg("删除失败!")
                        
                        }
                    }
                });
                layer.close(index);
            });                

 

结论是:

1.前端如果传来的是json数据,时间格式是正确的,那么@JsonFormat是可以正确将其转换成Date类型的。

2.前端如果传来的是json数据,时间格式是正确的,那么@DateTimeFormat是可以正确将其转换成Date类型的。

3.但是,用json出参时用注解@DateTimeFormat似乎行不通,就是前面的问题,json返回Date对象时,java的序列化会把date变成一串数字,然后@dataTimeFormat似乎无法解决这个问题。

 

结论:

1.如果前后端传的数据都是json,那么后台接数据,传数据都可以用@JsonFormat。

2.@DateTimeFormat适合后端  接收   前端传来的数据,不管是不是json都可以正确转换成Date型数据,只要前端传来的格式正确且后端@DateTimeFormat的pattern写正确了,但是这个注解无法将Date型数据用json传到后端去。

 

以上是关于关于JavaDate数据返回到前端变数字的问题的主要内容,如果未能解决你的问题,请参考以下文章

javaDate类

微信小程序----关于变量对象data 和 前端wxml取后台js变量值

微信小程序----关于变量对象data 和 前端wxml取后台js变量值

前端怎么判断后台返回的0或1来渲染不同的页面

“Java Date() 以 UTC 形式返回日期”——它实际上是啥意思?

@ResponseBody后台解析JSON返回前端时大写字母变小写的问题