Datatables v1.10日期格式化为dd/mm/yyyy h:i:s失败求助
解决Datatables v1.10日期格式化错误的问题
嘿,我完全懂你现在的烦躁——明明接口返回的是2011-03-07 16:12:39这种标准的YYYY-MM-DD HH:mm:ss格式,想转成dd/mm/yyyy h:i:s,结果所有日期都变成了7-2-2011,连时间都没了,这肯定是哪里的逻辑出了问题。我帮你拆解下问题,再给你靠谱的解决方案。
你之前出错的核心原因
大概率是你在日期解析或格式化时搞混了月份和日期的顺序,或者没有正确处理时间部分。比如:
- 直接用
new Date(data)时,部分浏览器对YYYY-MM-DD HH:mm:ss的解析存在兼容性问题,导致日期对象创建错误; - 格式化时错误地把日期(day)放在了月份(month)的位置,或者忘记给月份加1(因为JS的
Date对象月份是从0开始的); - 没有提取时间部分,只格式化了日期,导致时间丢失,还把日期月份搞反了。
正确的实现方案(原生JS版,无需额外库)
直接在Datatables的columns.render里写自定义逻辑,先正确解析日期,再按要求格式化:
$('#your-table-id').DataTable({ // 其他配置项... columns: [ // 其他列配置... { data: 'date_field_name', // 替换成你接口返回的日期字段名 render: function(data, type, row) { // 空值处理 if (!data || data === '') return ''; // 拆分日期和时间部分 const [dateStr, timeStr] = data.split(' '); const [year, month, day] = dateStr.split('-').map(Number); const [hours, minutes, seconds] = timeStr.split(':').map(Number); // 创建正确的Date对象:注意JS月份是0-11,所以要减1 const dateObj = new Date(year, month - 1, day, hours, minutes, seconds); // 格式化成dd/mm/yyyy h:i:s,补零保证两位格式 const formattedDay = String(dateObj.getDate()).padStart(2, '0'); const formattedMonth = String(dateObj.getMonth() + 1).padStart(2, '0'); // 加1转回实际月份 const formattedYear = dateObj.getFullYear(); const formattedHours = String(dateObj.getHours()).padStart(2, '0'); const formattedMinutes = String(dateObj.getMinutes()).padStart(2, '0'); const formattedSeconds = String(dateObj.getSeconds()).padStart(2, '0'); return `${formattedDay}/${formattedMonth}/${formattedYear} ${formattedHours}:${formattedMinutes}:${formattedSeconds}`; } } // 其他列配置... ] });
更简洁的方案(用Moment.js)
如果你项目里已经引入了Moment.js,那代码会简单很多,它能完美处理各种日期格式的解析和格式化:
$('#your-table-id').DataTable({ // 其他配置项... columns: [ // 其他列配置... { data: 'date_field_name', render: function(data, type, row) { return data ? moment(data).format('DD/MM/YYYY HH:mm:ss') : ''; } } // 其他列配置... ] });
验证下效果
用你给出的测试日期2011-03-07 16:12:39,上面两种方案都会输出07/03/2011 16:12:39,完全符合你的需求。
内容的提问来源于stack exchange,提问作者user1532468
相关产品推荐
相关产品推荐

