关于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传到后端去。

原文地址:https://www.cnblogs.com/wangshen31/p/8961691.html