Extends the Date native object to include extra methods (on top of those in Date.js).
Date.implement({
timeDiffInWords: function(relative_to){
return Date.distanceOfTimeInWords(this, relative_to || new Date);
},
timeDiff: function(to, joiner){
if (to == null) to = new Date;
var delta = ((to - this) / 1000).toInt();
if (!delta) return '0s';
var durations = {s: 60, m: 60, h: 24, d: 365, y: 0};
var duration, vals = [];
for (var step in durations){
if (!delta) break;
if ((duration = durations[step])){
vals.unshift((delta % duration) + step);
delta = (delta / duration).toInt();
} else {
vals.unshift(delta + step);
}
}
return vals.join(joiner || ':');
}
});
Date.alias('timeAgoInWords', 'timeDiffInWords');
Date.extend({
distanceOfTimeInWords: function(from, to){
return Date.getTimePhrase(((to - from) / 1000).toInt());
},
getTimePhrase: function(delta){
var suffix = (delta < 0) ? 'Until' : 'Ago';
if (delta < 0) delta *= -1;
var units = {
minute: 60,
hour: 60,
day: 24,
week: 7,
month: 52 / 12,
year: 12,
eon: Infinity
};
var msg = 'lessThanMinute';
for (var unit in units){
var interval = units[unit];
if (delta < 1.5 * interval){
if (delta > 0.75 * interval) msg = unit;
break;
}
delta /= interval;
msg = unit + 's';
}
delta = delta.round();
return Date.getMsg(msg + suffix, delta).substitute({delta: delta});
}
});
Date.defineParsers(
{
“today”, “tomorrow”, “yesterday”
re: /^(?:tod|tom|yes)/i,
handler: function(bits){
var d = new Date().clearTime();
switch(bits[0]){
case 'tom': return d.increment();
case 'yes': return d.decrement();
default: return d;
}
}
},
{
“next Wednesday”, “last Thursday”
re: /^(next|last) ([a-z]+)$/i,
handler: function(bits){
var d = new Date().clearTime();
var day = d.getDay();
var newDay = Date.parseDay(bits[2], true);
var addDays = newDay - day;
if (newDay <= day) addDays += 7;
if (bits[1] == 'last') addDays -= 7;
return d.set('date', d.getDate() + addDays);
}
}
);