Проблема с сортировкой дат с помощью jquery tablesorter
-
11-09-2019 - |
Вопрос
Я использую плагин tablesorter для сортировки моих таблиц в приложении MVC .NET.Большинство моих столбцов - это строки, и у меня не возникает с ними никаких проблем.Ни с числовыми единицами.Дело в том, что мои столбцы datetime также сортируются так, как если бы они были строками.Они сортируются следующим образом:01/04/2009, 02/02/2009, 03/08/2009 и т.д.Я получаю данные из Модели в этом Представлении.
Мой вызов используется по умолчанию:
$("#table").tablesorter();
Я попытался указать dateformat, но безуспешно:
$("#table").tablesorter({
dateFormat: 'dd/mm/yyyy'});
Странная вещь происходит, когда я вручную набираю статическую таблицу со случайными датами.Все будет улажено!Но мои данные поступают из вызова базы данных и помещаются в Модель, затем я обрабатываю ее и записываю tr с данными.
Заранее благодарю.
Редактировать:Может ли это быть как-то связано с тем, как я создаю tr?
<% foreach (var item in Model) { %>
<tr>
<td>
<%= Html.Encode(item.date) %>
</td>
<td>...</td>
<td>...</td>
<td>...</td>
</tr>
<% } %>
Решение
Попробуйте добавить анализатор Tablesorter в свой столбец date.Tablesorter поставляется с анализатором для shortDate, usLongDate и ISODate.
$("#table").tablesorter({
headers: { colNum: { sorter: 'shortDate'} }
});
где colNum - столбец с датами.Единственный пример, который я смог найти на сайте tablesorter, - это здесь.Это также работает, если tablesorter также неправильно сортирует числа.Существуют и другие парсеры для определения процента, ip-адреса и многого другого.Взгляните ближе к концу исходного кода, и они будут перечислены там.
Редактировать: При просмотре исходного кода параметр DateFormat, по-видимому, ищет только "us", "uk", "dd / mm / yy" или "dd-mm-yy".Что происходит, когда вы пробуете "uk"?
Другие советы
У меня возникла та же проблема, и я добавил пользовательский анализатор под названием datetime:
$.tablesorter.addParser({
id: "datetime",
is: function(s) {
return false;
},
format: function(s,table) {
s = s.replace(/\-/g,"/");
s = s.replace(/(\d{1,2})[\/\-](\d{1,2})[\/\-](\d{4})/, "$3/$2/$1");
return $.tablesorter.formatFloat(new Date(s).getTime());
},
type: "numeric"
});
Затем вам просто нужно применить этот формат к нужным столбцам, как указано в Gabe G (например, чтобы назначить этот сортировщик первому столбцу, вам следует выполнить следующее:
$("#mytable").tablesorter(
{ dateFormat: 'dd/mm/yyyy',
headers:
{
0:{sorter:'datetime'}
}
} );
Вы также можете добавить скрытый тег span перед вашей датой в числовом формате (ггггммдд).Этот текст будет первым и использоваться для сортировки, но он будет скрыт от глаз и отображать только тот формат, который вы хотите.
<td><span style="display:none">20130923</span>23 September 2013</td>
Существует обновление для плагина jquery tablesorter.
В соответствии с локализацией вашего приложения вы можете отсортировать даты по этому обновлению.
Вы можете просмотреть обновление tablesorter, перейдя по ссылке ниже.
Более простой способ использования:
dateFormat:'mm/dd/yyyy hh:mm:ss'
Честно говоря, самым простым решением для меня было, как сказал compsmart, добавление некоторого скрытого текста перед фактической датой.
- Формат даты:"великобритания" у меня это не сработало, может быть, потому, что мой формат даты снова отличается
- http://tablesorter.openwerk.de/ включает в себя изменение CSS, во-первых, я не понимаю, почему, а во-вторых, требуется больше усилий, чем простое добавление скрытого текста перед датой.
Мне нравится решение KISS от compsmart!
http://mottie.github.io/tablesorter/docs/
Установите формат даты.Вот доступные варианты.(Модифицированная версия v2.0.23).
- "mmddyyyyy" (по умолчанию)
- "ддмммйййй"
- "ггггммдд"
В предыдущих версиях этот параметр был установлен как "сша", "Великобритания" или "дд/мм/гг".Этот параметр был изменен, чтобы лучше соответствовать необходимым форматам дат.Это будет работать только с четырехзначными годами!
Сортировщик должен быть настроен на "shortDate", а формат даты может быть установлен в опции "DateFormat" или установлен для определенных столбцов в опции "headers".Посмотрите демонстрационную страницу, чтобы увидеть, как это работает.
$(function(){
$("table").tablesorter({
dateFormat : "mmddyyyy", // default date format
// or to change the format for specific columns,
// add the dateFormat to the headers option:
headers: {
0: { sorter: "shortDate" }, // "shortDate" with the default dateFormat above
1: { sorter: "shortDate", dateFormat: "ddmmyyyy" }, // day first format
2: { sorter: "shortDate", dateFormat: "yyyymmdd" } // year first format
}
});
});
Отдельные столбцы могут быть изменены путем добавления следующего (все они выполняют одно и то же действие), установленного в порядке приоритета (измененная версия v2.3.1):
- Данные jQuery data-DateFormat="mmddyyyyy".
- класс метаданных="{ DateFormat:'ммдддыыыы'}".Для этого требуется плагин метаданных.
- заголовки опции headers :{ 0 :{ Формат даты :'ммдддыыыы' } }.
- имя класса заголовка class="DateFormat-mmddyyyyy".Общий параметр DateFormat.
В моем случае я использовал
$("#myTable").tablesorter({dateFormat: "uk"})
для версии.
Это был ответ для меня:
<td data-order=<fmt:formatDate pattern = "yyyy-MM-dd" value = "${myObject.myDate}" />>${myObject.myDate}</td>
более подробная информация здесь: https://datatables.net/manual/data/