好吧,所以我已经在互联网上搜索了几天了,但我仍然被难住了。我有一个JSP,它进行数据库调用,并在Datatables表中显示数据。现在,当日期传递到页面时,其格式为yyyy-MM-dd hh:MM:ss。我们的用户(美国)习惯于看到MM/dd/yyyy格式,所以我使用fmt:formatDateJSTL标记来显示它。不幸的是,无论出于什么原因,JS都不喜欢这个标签,我也不知道为什么。
这是javascript:
jQuery.extend( jQuery.fn.dataTableExt.oSort, {
"date-us-pre": function ( a ) {
var usDatea = a.split('/');
return (usDatea[2] + usDatea[1] + usDatea[0]) * 1;
},
"date-us-asc": function ( a, b ) {
return ((a < b) ? -1 : ((a > b) ? 1 : 0));
},
"date-us-desc": function ( a, b ) {
return ((a < b) ? 1 : ((a > b) ? -1 : 0));
}
} );
我把它放在一个名为jquery.datesort.js的文件中,我把它包含在页面上。以下是我使用的初始化:
$(document).ready(function() {
$('#institution').dataTable( {
"sScrollY": "200px",
"iDisplayLength": 25,
"sPaginationType": "full_numbers",
"bScrollCollapse": true,
"aoColumns": [
null,
null,
null,
null,
null,
{ "sType": "date-us" },
null,
null
]
} )
} );
我知道这是有效的,因为我用伪数据测试了它,在伪数据中,我只需将日期以MM/dd/yyyy的格式硬编码到表中。当我这样做的时候,排序工作正如预期的那样(按年、按月、按天排序)。
现在是表体的代码:
<tbody>
<c:forEach items="${STAT.rows}" var="item">
<c:set value="${item.LOC_ID}" var="locationID"/>
<tr>
<td><c:out value="${item.NAME}" /></td>
<td><c:out value="${item.SUBSCRIPT}" /></td>
<td><c:out value="${item.ADDRESS}" /></td>
<td><c:out value="${item.RESULT}" /></td>
<td><c:out value="${item.STATUS}" /></td>
<td><fmt:formatDate pattern="MM/dd/yyyy" value="${item.DATE}" /></td>
<td><c:out value="${item.TYPE}" /></td>
<td><c:out value="${item.RA}" /></td>
</tr>
</c:forEach>
</tbody>
这可以很好地将数据输出为MM/dd/yyyy格式,但由于某种原因,我的排序根本不喜欢它。当我单击排序按钮时,它们会更改图像(向上箭头变为向下箭头,反之亦然),以反映正在执行排序,但数据没有在屏幕上排序。此外,如果我删除fmt:formatDate标记并注释掉日期排序的js,则日期将呈现为yyyy-MM-dd hh:MM:ss,并且将以这种方式进行排序而不会出现问题(正如预期的那样)。
我有点困惑,因为我认为fmt:formatDate将在服务器端发生,因为它是JSTL。这意味着客户端只会看到MM/dd/yyyy的后格式化数据,当js在客户端做它的事情时,它应该与我硬编码日期时没有任何不同。。。但这并没有发生。
有什么想法吗?有没有什么明显的问题我遗漏了?
编辑(1):我使用的是JDeveloper 11G R2。此行为发生在集成WebLogic服务器和独立WebLogic服务器中。
还有一些字体标签也在使用中。移除它们后,一切都会正常工作。