ASP.Net模型日期转JS问题:ko数组中日期格式异常如何转换?
搞定ASP.NET JSON序列化的日期格式问题
嗨,这个问题我之前也碰到过,给你捋捋清楚~
首先,你看到的/Date(1520582400000)/是ASP.NET早期默认的JSON日期序列化格式:它本质是把.NET的DateTime对象转换成了毫秒级时间戳(1520582400000就是从1970年1月1日UTC零点开始到2018年3月9日的毫秒数),外面套了/Date()的壳子,是当时ASP.NET内置JSON序列化器的标准输出方式。
接下来给你两种最实用的解决办法,按需选就行:
方法一:在C#端换用Json.NET序列化(推荐)
ASP.NET内置的Json.Encode比较老旧,换成Newtonsoft.Json(也就是Json.NET,现在.NET生态里的常用序列化库)来序列化,直接就能输出JS原生支持的ISO 8601格式日期(比如"2018-03-09T00:00:00"),不用额外处理:
var List = @(Html.Raw(Newtonsoft.Json.JsonConvert.SerializeObject(Model.Item)));
这样你在JS里直接new Date(List.Date)就能得到正确的Date对象,Knockout也能直接绑定使用。
方法二:在JS端写工具函数转换
如果不想改后端代码,就写个简单的JS函数把/Date(xxx)/格式转成JS Date对象或者你需要的字符串格式:
// 把ASP.NET格式日期转成JS Date对象 function parseAspNetDate(aspDateStr) { // 提取括号里的时间戳数字 const timestamp = parseInt(aspDateStr.match(/\d+/)[0]); return new Date(timestamp); } // 使用示例: const jsDate = parseAspNetDate(List.Date); // 如果要转成"3/9/2018"这种格式 const formattedDate = jsDate.toLocaleDateString('en-US'); // 输出"3/9/2018"
要是用Knockout,还可以把这个逻辑封装成计算属性,方便绑定:
const viewModel = { item: ko.observable(List), displayDate: ko.computed(function() { const aspDate = this.item().Date; const date = parseAspNetDate(aspDate); return date.toLocaleDateString('en-US'); }, viewModel) };
简单总结下:这个格式就是ASP.NET老序列化器的特殊日期写法,要么换更现代的序列化工具从根源解决,要么在前端写转换函数处理~
内容的提问来源于stack exchange,提问作者BStill
相关产品推荐
相关产品推荐

