I've been tasked with unifying date formats of an HTML table that has different databases feeding into it. Utilizing a SQL procedure is not an option. The known truths are the cells in the TBODY will be plain text or plain text wrapped in one link.
I wrote a jQuery plugin that does the job, but I'm wondering if would make sense to do innerHTML versus looping through each TD.
original plugin:
$.fn.reformatAllDates = function () {
var $txt = $(this).text();
var reformatDate = function ($str) {
var $parts = $str.split('/'),
$year = $parts[2],
$month = $parts[0],
$day = $parts[1];
if ($parts.length === 3) {
$month = $month.length < 2 ? '0' + $month : $month;
$day = $day.length < 2 ? '0' + $day : $day;
//Returns dates in sort friendly format [YYYY-MM-DD]
return $year + '-' + $month + '-' + $day;
}
return $str;
};
var $result, $reg = new RegExp(/^\d{1,2}\/\d{1,2}\/\d{4}$/);
while (($result = $reg.exec($txt)) !== null) {
var $match = $reg.exec($txt)[0];
var $newFormat = reformatDate($match);
$txt = $txt.replace($match, $newFormat);
}
return $(this).html($txt);
}
original implementation:
$('table.display tbody tr td').each(function () {
if ($(this).html().indexOf('href') >= 0)
$(this).find('a:first').reformatAllDates();
else
$(this).reformatAllDates();
});
innerHTML implementation:
$('table.display tbody').reformatAllDates();
This works, though I haven't yet tested how big the innerHTML can be before it fails and prepared the fallback steps in...
$.fn.reformatAllDates = function () {
var $result,
$reg = new RegExp(/\d{1,2}\/\d{1,2}\/\d{4}/),
$r2 = new RegExp(/[\n\r\f]/g),
$html = $(this).html();
$html = $html.replace($r2,'');
$html = $html.replace($r2,'');
var reformatDate = function ($str) {
var $parts = $str.split('/'),
$year = $parts[2],
$month = $parts[0],
$day = $parts[1];
if ($parts.length === 3) {
$month = $month.length < 2 ? '0' + $month : $month;
$day = $day.length < 2 ? '0' + $day : $day;
return $year + '-' + $month + '-' + $day;
}
return $str;
};
var $match, $newFormat, $msg;
while (($result = $reg.exec($html)) !== null) {
$match = $reg.exec($html)[0];
$newFormat = reformatDate($match);
var $re = new RegExp($match,"g");
$html = $html.replace($re, $newFormat);
}
return $(this).html($html);
}
tdselection and loop into the plugin without changing your method of accessing the data, giving you the "ideal implementation"reformatAllDates()on the wrong element. See: jsfiddle.net/userdude/gkeL6$.html()instead of$.text()to set the reformatted date: .9 seconds to reformat in FF, 0.43 in Chrome. Looks like$this.html(formatted date)is the winner at this point. The fiddle in question: jsfiddle.net/userdude/gkeL6/10