java时间传到前端变成数字_关于JavaDate数据返回到前端变数字的问题(并引申到前后端时间的传输)...

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

53323d3287d76785a7237f595c55f48a.png

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

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

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

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

35d69cf9b74aa10b9eea87b3cd421031.png

效果:

7d50d5af29ebb7c0268f9c11beff41fe.png

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

@DateTimeFormat

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

这里也有个小例子:

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

227c66296e4165054b4dbba9ce1dba1e.gif

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() {

}

});

bd39b1204244f01d59d537b6f7c5529b.gif

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

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

看后端代码:

f5da3b099695f12d2e51df0cd260b334.gif

@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";

}

}

45f22d354d09ffc7db88b9b6b6db1fb8.gif

接收成功!(这里不是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用这个实体来接收

537a04e4d97029fe4864a68bb3eee8ac.gif

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);

});

deb58526e9012bf2fd09b6c532fe4ed3.gif

结论是:

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
科学计数法是一种表示大数或小数的方法,它使用指数来表示数字的数量级。在Java中,当将数字转换为字符串并返回前端时,如果数字太大或太小,它可能会以科学计数法的形式显示。这可能会导致数字不正确的显示。 为了解决这个问题,可以使用BigDecimal类来处理数字。在代码中,可以将Double类型的数字转换为BigDecimal,并使用toPlainString()方法将其转换为字符串。这样可以确保数字以普通的十进制形式显示,而不是科学计数法。例如,可以使用以下代码来解决这个问题: ```java public static void main(String\[\] args) { Double dd = new Double(123456789d); BigDecimal bd = new BigDecimal(dd + ""); System.out.println(bd.toPlainString()); } ``` 这样,返回前端的字符串将以普通的十进制形式显示,而不是科学计数法。 #### 引用[.reference_title] - *1* [BigDecimal变成科学计数法](https://blog.csdn.net/qq_39022699/article/details/129450794)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [Java中Double类型出现科学计数法问题解决方法](https://blog.csdn.net/ZeJava/article/details/129044560)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值