BETEPAH,
ещё неплохо вынести $('[data-time]') из таймера определив переменной выше, накладные затраты на поиск каждый раз исчезнут. Дату сделал с вариантом. За Math.floor спасибо, так лучше.
<b data-time="2014-05-01 0:55:00"></b><br>
<b data-time="2014-05-01"></b>
<script>
String.prototype.plural = Number.prototype.plural = function(a, b, c) {
var index = this % 100;
index = (index >=11 && index <= 14) ? 0 : (index %= 10) < 5 ? (index > 2 ? 2 : index): 0;
return(this+[a, b, c][index]);
}
$datatime=$('[data-time]');
function downtimers(){
$datatime.each(function(){
var d,h,m;
var t = $(this).data('time').split(/[^0-9]/);
var s = Math.floor(((new Date (t[0], t[1]-1, t[2], t[3]?t[3]:0, t[4]?t[4]:0, t[5]?t[5]:0)).getTime() - (new Date().getTime())) / 1000);
if(s<0)
$(this).text('акция закончилась');
else{
s-=(d=Math.floor(s/60/60/24))*24*60*60;
s-=(h=Math.floor(s/60/60))*60*60;
s-=(m=Math.floor(s/60))*60;
$(this).text(
(d<10?'0'+d:d).plural(" дней "," день "," дня ")+
(h<10?'0'+h:h).plural(" часов "," час "," часа ")+
(m<10?'0'+m:m).plural(" минут "," минута "," минуты ")+
(s<10?'0'+s:s).plural(" секунд "," секунда "," секунды ")
);
}
});
}
downtimers();
setInterval(downtimers,1000);
</script>