Проблема с сортировкой дат с помощью jquery tablesorter
Я использую плагин tablesorter для сортировки моих таблиц в приложении MVC.NET. Большинство моих столбцов являются строками, и у меня нет проблем с ними. Ни с числовыми. Дело в том, что мои столбцы datetime также сортируются так, как если бы они были строками. Они сортируются следующим образом: 01/04/2009, 02/02/2009, 03/08/2009 и т.д. Я получаю данные из Модели в этом представлении.
Мой вызов по умолчанию:
$("#table").tablesorter();
Я пробовал указать dateformat без везения:
$("#table").tablesorter({
dateFormat: 'dd/mm/yyyy'});
Нечетная вещь случается, когда я вручную набираю статическую таблицу со случайными датами. Он сортируется! Но мои данные поступают из вызова БД и помещаются в Модель, затем я обрабатываю его и записываю tr с данными.
Спасибо заранее.
EDIT: Может быть, это связано с тем, как я создаю tr?
<% foreach (var item in Model) { %>
<tr>
<td>
<%= Html.Encode(item.date) %>
</td>
<td>...</td>
<td>...</td>
<td>...</td>
</tr>
<% } %>
Ответы
Ответ 1
Попробуйте добавить парсер Tablesorter к столбцу даты. Tablesorter поставляется с парсером для shortDate, usLongDate и isoDate.
$("#table").tablesorter({
headers: { colNum: { sorter: 'shortDate'} }
});
где colNum - столбец с датами. Единственный пример, который я мог найти на сайте tablesorter, - здесь. Это также работает, если tablesorter также сортирует числа. Существуют и другие парсеры, а также проценты, IP-адрес и многое другое. Посмотрите ближе к концу исходного кода, и они будут перечислены там.
Edit:
Рассматривая исходный код, параметр dateFormat выглядит только для "us", "uk", "dd/mm/yy" или "dd-mm-yy". Что происходит, когда вы пытаетесь "uk"?
Ответ 2
У меня такая же проблема, и я добавил собственный парсер, называемый 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'}
}
} );
Ответ 3
Вы также можете добавить скрытый тег span перед вашей датой в цифровом формате (yyyymmdd). Этот текст будет первым и будет использоваться для сортировки, но он будет скрыт от поля зрения и отобразит только желаемый формат.
<td><span style="display:none">20130923</span>23 September 2013</td>
Ответ 4
Существует обновление для плагина jquery tablesorter.
В соответствии с локалью вашего приложения вы можете сортировать даты по этому обновлению.
Вы можете просмотреть обновление tablesorter, следуя приведенной ниже ссылке.
http://tablesorter.openwerk.de/
Ответ 5
Более простой способ использования:
dateFormat:'mm/dd/yyyy hh:mm:ss'
Ответ 6
Честно говоря, самым простым решением для меня было, как сказал compsmart, добавить скрытый текст перед фактической датой.
- dateFormat: 'uk' не работал у меня, возможно, потому что мой формат даты снова отличается
- http://tablesorter.openwerk.de/ включает в себя изменение CSS, сначала я не понимаю, почему и вторые усилия больше, чем простое добавление скрытого текста спереди от даты.
Мне нравится решение KISS от compsmart!
Ответ 7
http://mottie.github.io/tablesorter/docs/
Установите формат даты. Вот доступные варианты. (Изменено v2.0.23).
- "mmddyyyy" (по умолчанию)
- "ddmmyyyy"
- "ггггммдд"
В предыдущих версиях эта опция была установлена как "us", "uk" или "dd/mm/yy". Этот параметр был изменен, чтобы лучше соответствовать форматам дат. Он будет работать только с четырехзначными годами!
Сортировщик должен быть установлен на "shortDate", а формат даты можно установить в опции "dateFormat" или установить для определенных столбцов в опции "заголовки". См. Демонстрационную страницу, чтобы увидеть, как она работает.
$(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 = "mmddyyyy".
- metadata class= "{dateFormat: 'mmddyyyy}. Для этого требуется плагин метаданных.
- Заголовки заголовков заголовков: {0: {dateFormat: 'mmddyyyy}}.
- имя класса заголовка class= "dateFormat-mmddyyyy".
Общая опция dateFormat.
В моем случае я использовал
$("#myTable").tablesorter({dateFormat: "uk"})
для версии.
Ответ 8
Это был ответ для меня:
<td data-order=<fmt:formatDate pattern = "yyyy-MM-dd" value = "${myObject.myDate}" />>${myObject.myDate}</td>
подробнее, здесь: https://datatables.net/manual/data/