Problema con l'ordinamento delle date con jquery tablesorter
-
11-09-2019 - |
Domanda
Sto utilizzando il plug-in Tablesorter per ordinare le mie tabelle in un'app MVC .NET.La maggior parte delle mie colonne sono stringhe e non ho problemi con esse.Nemmeno con quelli numerici.Il fatto è che anche le mie colonne datetime vengono ordinate come se fossero stringhe.Vengono ordinati in questo modo:01/04/2009, 02/02/2009, 03/08/2009, ecc.Ottengo i dati dal modello in quella vista.
La mia chiamata è quella predefinita:
$("#table").tablesorter();
Ho provato a specificare il formato della data senza fortuna:
$("#table").tablesorter({
dateFormat: 'dd/mm/yyyy'});
La cosa strana accade quando digito manualmente una tabella statica con date casuali.Si sistema!Ma i miei dati provengono da una chiamata DB e vengono inseriti nel modello, quindi lo eseguo e scrivo tr con i dati.
Grazie in anticipo.
MODIFICARE:Potrebbe essere qualcosa legato al modo in cui creo le tr?
<% foreach (var item in Model) { %>
<tr>
<td>
<%= Html.Encode(item.date) %>
</td>
<td>...</td>
<td>...</td>
<td>...</td>
</tr>
<% } %>
Soluzione
Prova ad aggiungere un parser Tablesorter alla colonna della data.Tablesorter viene fornito con un parser per shortDate, usLongDate e isoDate.
$("#table").tablesorter({
headers: { colNum: { sorter: 'shortDate'} }
});
dove colNum è la colonna con le date.L'unico esempio che ho trovato sul sito tablesorter è Qui.Funziona anche se il tablesorter ordina i numeri in modo errato.Esistono anche altri parser per percentuale, indirizzo IP e altro.Dai un'occhiata verso la fine del codice sorgente e saranno elencati lì.
Modificare:Osservando il codice sorgente, l'opzione dateFormat sembra cercare solo "noi", "uk", "gg/mm/aa" o "gg-mm-aa".Cosa succede quando provi "uk"?
Altri suggerimenti
Ho riscontrato lo stesso problema e ho aggiunto un parser personalizzato chiamato 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"
});
Quindi devi solo applicare quel formato alle colonne che desideri, come esposto Gabe G (ad esempio per assegnare questo selezionatore alla prima colonna dovresti fare quanto segue:
$("#mytable").tablesorter(
{ dateFormat: 'dd/mm/yyyy',
headers:
{
0:{sorter:'datetime'}
}
} );
Puoi anche aggiungere un tag span nascosto prima della data in formato numerico (aaaammgg).Questo testo verrà per primo e verrà utilizzato per l'ordinamento, ma sarà nascosto alla vista e mostrerà solo il formato desiderato.
<td><span style="display:none">20130923</span>23 September 2013</td>
Esiste un aggiornamento per il plugin jquery tablessorter.
In base alla locale della tua applicazione, puoi ordinare le date in base a questo aggiornamento.
È possibile visualizzare l'aggiornamento del tablesorter seguendo il collegamento sottostante.
Modo più semplice per l'uso:
dateFormat:'mm/dd/yyyy hh:mm:ss'
Ad essere onesti, la soluzione più semplice per me è stata, come ha detto compsmart, aggiungere del testo nascosto davanti alla data effettiva.
- formato data:'UK' non funzionava per me, forse perché il formato della mia data è di nuovo diverso
- http://tablesorter.openwerk.de/ comporta la modifica del CSS, in primo luogo non capisco perché e in secondo luogo lo sforzo è maggiore della semplice aggiunta di testo nascosto davanti alla data.
Mi piace la soluzione KISS di compsmart!
http://mottie.github.io/tablesorter/docs/
Imposta il formato della data.Ecco le opzioni disponibili.(V2.0.23 modificato).
- "mmddyyyy" (predefinito)
- "ggmmaaaa"
- "aaaammgg"
Nelle versioni precedenti, questa opzione era impostata come "noi", "regno Unito" o "gg/mm/aa".Questa opzione è stata modificata per adattarsi meglio ai formati di data necessari.Funzionerà solo con anni a quattro cifre!
L'ordinatore deve essere impostato su "shortDate" e il formato della data può essere impostato nell'opzione "dateFormat" o impostato per colonne specifiche nell'opzione "headers".Guarda la pagina demo per vederlo funzionare.
$(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
}
});
});
Le singole colonne possono essere modificate aggiungendo quanto segue (fanno tutte la stessa cosa), impostate in ordine di priorità (Modificato v2.3.1):
- jQuery dati data-dateFormat="mmddyyyy".
- classe metadati="{ dateFormat:'mmddyyyy'}".Ciò richiede il plug-in dei metadati.
- intestazioni opzione intestazioni:{0:{ formato data :'mmggaaaa' } }.
- nome della classe di intestazione class="dateFormat-mmddyyyy".Opzione dateFormat complessiva.
Nel mio caso ho usato
$("#myTable").tablesorter({dateFormat: "uk"})
per la versione.
Questa è stata la risposta per me:
<td data-order=<fmt:formatDate pattern = "yyyy-MM-dd" value = "${myObject.myDate}" />>${myObject.myDate}</td>
maggiori dettagli, qui: https://datatables.net/manual/data/