如何在服务端模式的jQuery DataTable中格式化日期时间列
解决jQuery DataTables日期列显示
/Date(xxx)/格式的问题 这是ASP.NET中常见的JSON日期序列化问题——默认的JsonResult会把DateTime类型序列化成/Date(ticks)/这种格式,咱们可以从前端DataTables处理或者后端C#序列化处理两个方向解决,看你更倾向哪种:
方案1:前端DataTables中格式化日期(推荐,保留后端原始数据)
这种方式不用修改后端逻辑,直接在DataTables的列配置中通过render函数转换格式,灵活性更高。
步骤1:编写通用的JSON日期解析函数
先写一个工具函数,用来把/Date(1373947200000)/这种格式的字符串转换成JavaScript的Date对象:
function parseJsonDate(jsonDate) { // 提取字符串中的时间戳部分 var timestamp = parseInt(jsonDate.match(/\d+/)[0]); return new Date(timestamp); }
步骤2:修改DataTables的列配置
给对应的日期列添加render函数,根据需求格式化日期/日期时间:
RECEIVED_DATE是纯日期,格式化为yyyy-MM-ddAUDIT_CREATE_DT和AUDIT_UPDT_DT是日期时间,格式化为yyyy-MM-dd HH:mm:ss
修改后的完整columns配置代码:
"columns": [ { "data": "STS", "name": "STS" }, { "data": "RECEIVED_DATE", "name": "RECEIVED_DATE", "render": function(data, type, row) { if (!data) return ""; // 处理空值 var date = parseJsonDate(data); // 格式化纯日期:年-月-日(补零保证两位) return `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, '0')}-${String(date.getDate()).padStart(2, '0')}`; } }, { "data": "MBR_AGP_ID_NUM", "name": "MBR_AGP_ID_NUM" }, { "data": "MBR_FST_NME", "name": "MBR_FST_NME" }, { "data": "MBR_LST_NME", "name": "MBR_LST_NME" }, { "data": "CREATE_USR_ID", "name": "CREATE_USR_ID" }, { "data": "AUDIT_CREATE_DT", "name": "AUDIT_CREATE_DT", "render": function(data, type, row) { if (!data) return ""; var date = parseJsonDate(data); // 格式化日期时间:年-月-日 时:分:秒 return `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, '0')}-${String(date.getDate()).padStart(2, '0')} ${String(date.getHours()).padStart(2, '0')}:${String(date.getMinutes()).padStart(2, '0')}:${String(date.getSeconds()).padStart(2, '0')}`; } }, { "data": "UPDT_USR_ID", "name": "UPDT_USR_ID" }, { "data": "AUDIT_UPDT_DT", "name": "AUDIT_UPDT_DT", "render": function(data, type, row) { if (!data) return ""; var date = parseJsonDate(data); // 和创建日期保持一致的格式 return `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, '0')}-${String(date.getDate()).padStart(2, '0')} ${String(date.getHours()).padStart(2, '0')}:${String(date.getMinutes()).padStart(2, '0')}:${String(date.getSeconds()).padStart(2, '0')}`; } }, ]
方案2:后端C#序列化时直接转换为字符串格式
如果希望前端逻辑更简单,可以在后端返回JSON之前,把DateTime类型直接转成指定格式的字符串。
修改你的GetList方法中的数据包装部分,用匿名类来格式化日期字段:
[HttpPost] public ActionResult GetList() { //Server side Parameters int start = Convert.ToInt32(Request["start"]); int length = Convert.ToInt32(Request["length"]); string searchValue = Request["search[value]"]; string sortColumnName = Request["columns[" + Request["order[0][column]"] + "][Name]"]; string sortDirection = Request["order[0][dir]"]; List<DISPRTY_FORM> disprtyFormList = new List<DISPRTY_FORM>(); using (DBModel db = new DBModel()) { disprtyFormList = db.DISPRTY_FORM.ToList<DISPRTY_FORM>(); int totalrows = disprtyFormList.Count; //Todo filtering int totalRowsAfterFiltering = disprtyFormList.Count; //sorting disprtyFormList = disprtyFormList.OrderBy(sortColumnName + " " + sortDirection).ToList<DISPRTY_FORM>(); //paging disprtyFormList = disprtyFormList.Skip(start).Take(length).ToList<DISPRTY_FORM>(); // 格式化日期字段为字符串 var formattedData = disprtyFormList.Select(item => new { STS = item.STS, RECEIVED_DATE = item.RECEIVED_DATE?.ToString("yyyy-MM-dd"), MBR_AGP_ID_NUM = item.MBR_AGP_ID_NUM, MBR_FST_NME = item.MBR_FST_NME, MBR_LST_NME = item.MBR_LST_NME, CREATE_USR_ID = item.CREATE_USR_ID, AUDIT_CREATE_DT = item.AUDIT_CREATE_DT?.ToString("yyyy-MM-dd HH:mm:ss"), UPDT_USR_ID = item.UPDT_USR_ID, AUDIT_UPDT_DT = item.AUDIT_UPDT_DT?.ToString("yyyy-MM-dd HH:mm:ss") }); var jsonResult = Json(new { data = formattedData, draw = Request["draw"], recordsTotal = totalrows, recordsFiltered = totalRowsAfterFiltering }, JsonRequestBehavior.AllowGet); jsonResult.MaxJsonLength = int.MaxValue; return jsonResult; } }
这样后端返回的JSON中,日期字段已经是格式化好的字符串,前端DataTables可以直接显示,不需要额外处理。
内容的提问来源于stack exchange,提问作者crony
相关产品推荐
相关产品推荐

