As defined by the Australian Government (Commonwealth) style manual sort properly with the great jQuery Tablersorter plug-in. If you use dates or times in this format:
- 11 August 2012
- Saturday 11 August 2012
- 3 pm
- 4:30 pm
and use the plug-in without a custom parser your dates will just sort based on the number, not knowing the context (eg, am vs pm). Hopefully you will find these useful like I have. You are free to use and modify as you wish; I attach no license to the code. Please comment if you've got a better way, would like to contribute any similar parsers or have found them useful.
$.tablesorter.addParser({
id: 'commonwealthdate',
is: function (s) { return false; },
format: function (s) {
// Example: 1 August 2011
var months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],
t = s.split(' '),
u = t[2] + '' + months.indexOf(t[1]) + '' + t[0];
return Number(u);
},
type: 'numeric'
});
$.tablesorter.addParser({
id: 'commonwealthdate-ldF',
is: function (s) { return false; },
format: function (s) {
// Example: Monday 14 March
var months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],
t = s.split(' '),
u = months.indexOf(t[1]) + '' + t[1];
return Number(u);
},
type: 'numeric'
});
$.tablesorter.addParser({
id: 'commonwealthdate-ldFY',
is: function (s) { return false; },
format: function (s) {
// Example: Monday 14 March 2011
var months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],
t = s.split(' '),
u = t[3] + '' + months.indexOf(t[2]) + '' + t[1];
return Number(u);
},
type: 'numeric'
});
$.tablesorter.addParser({
id: 'commonwealth-time',
is: function (s) { return false; },
format: function (s) {
// Example: 9:30 am || 10 pm || noon/midnight
if (s.match(/noon/)) {
s = '12:00';
} else if (s.match(/midnight/)) {
s = '00:00';
}
if (!s.match(/:/)) {
// 10 pm to 10:00 pm
var amORpm = (s.match(/am$/)) ? 'am' : 'pm';
s = s.replace(' ' + amORpm, '') + ':00 ' + amORpm;
}
return $.tablesorter.formatFloat(new Date('2000/01/01 ' + s).getTime());
},
type: 'numeric'
});
If you are already sorting all tables on your site or just tables of a particular class you can get these working by adding class="{sorter:'commonwealthdate'}" on your <th> in the HTML and use the metadata plug-in. The alternative is to call the JavaScript with a fixed column number using the headers option, but this is a bit less flexible.
Add new comment