Note: After saving, you have to bypass your browser's cache to see the changes. Google Chrome, Firefox, Microsoft Edge and Safari: Hold down the ⇧ Shift key and click the Reload toolbar button. For details and instructions about other browsers, see Wikipedia:Bypass your cache.
/* Last mod duration inserter, version [0.0.1]
Originally from: http://en.wikipedia.org/wiki/User:Splarka/lastmod.js

Parses the "last mod" date in getElementById('lastmod') and returns a duration since.

Notes:
* Checks via API for your timezone offset preference.
** If none is found it uses site timezone offset.
*** Once found it sets a cookie for a day (or session).
* Inserts it as a text node in the 'lastmod' object.
* Language sensitive, fragile, can fail gracefully if the interace message or language changes.
*/

var lmRegex = /last modified on (\d+ [a-z]{3,10} \d{4}) at (\d{2}\:\d{2})\./i;

if(wgAction == 'view' && wgNamespaceNumber >= 0 && wgArticleId != 0) addOnloadHook(lastmodShowDuration)
function lastmodShowDuration() {
  var lm = document.getElementById('lastmod');
  if(!lm) return;
  if(!getCookie('timecorrection')) {
    getOffsetCookie();
    return;
  }
  var lmt = getText(lm);
  if(!lmt.match(lmRegex)[2]) return
  var lmdate = lmt.match(lmRegex)[1] + ' ' + lmt.match(lmRegex)[2];
  
  var lmd = new Date(lmdate + ' GMT');
  var now = new Date();
  var ms = lmd.getTime() - (parseInt(getCookie('timecorrection')) * 60000);
  lmd.setTime(ms);
  var diff = parseInt((now.getTime() - lmd.getTime()) / 1000);
  if(diff < 0) return
  lm.appendChild(document.createTextNode(' About ' + duration(diff,2) + ' ago.'));
}

function getOffsetCookie() {
  var url = mw.config.get('wgServer') + mw.config.get('wgScriptPath') + '/api.php?action=query&format=json&meta=userinfo|siteinfo&uiprop=options';
  var req = sajax_init_object();
  req.open('GET', url, true);
  req.onreadystatechange = function() {
    if(req.readyState == 4 && req.status == 200) {
      eval("getOffsetCookieHandler(" + req.responseText + ",'" + req.responseText.replace(/\'/g,"`") + "')");
    }
  }
  req.send(null);
}

function getOffsetCookieHandler(obj,txt) {
  if(obj['error']) {
    //jsMsg('Api error: ' + obj['error']['code'] + ' - ' + obj['error']['info'] + '\n');
    return;
  }
  var timeoffset = 0;
  if(obj['query'] && !obj['query']['general'] && !obj['query']['general']['timeoffset']) {
    timeoffset = obj['query']['general']['timeoffset'];
  }
  if(obj['query']['userinfo'] && obj['query']['userinfo']['options'] && obj['query']['userinfo']['options']['timecorrection']) {
    var tc = obj['query']['userinfo']['options']['timecorrection'].split('|');
    if(tc[1]) timeoffset = tc[1]
  }
  setCookie('timecorrection',timeoffset,1);
  if(getCookie('timecorrection')) lastmodShowDuration()
}

function duration(input,depth) {
  var num = input;
  var out = '';
  var s = num % 60; num = Math.floor(num / 60);
  var m = num % 60; num = Math.floor(num / 60);
  var h = num % 24; num = Math.floor(num / 24);
  var d = num % 7;  num = Math.floor(num / 7);
  var w = num % 52; num = Math.floor(num / 52);
  var y = num
  if(y > 0) out += y + 'yrs '
  if(y + w > 0) out += w + 'wks '
  if(y + w + d > 0) out += d + 'days '
  if(y + w + d + h > 0) out += h + 'hrs '
  if(y + w + d + h + m > 0) out += m + 'mins '
  out += s + 'secs';  
  if(depth && depth < out.split(' ').length) {
    out = out.split(' ').slice(0,depth).join(' ');
  }
  return out;
}

function getText(object) {
  if (object.nodeType == 3) return object.nodeValue;
  var txt = [];
  var i=0;
  while(object.childNodes[i]) {
    txt[txt.length] = getText(object.childNodes[i]);
    i++;
  }
  return txt.join('');
}

function setCookie(cookieName, cookieValue, days) {
  var today = new Date();
  var expire = new Date();
  var nDays = days || 365;
  expire.setTime(today.getTime() + (3600000 * 24 * nDays));
  document.cookie = cookieName + '=' + escape(cookieValue) + ';path=/' + ';expires='+expire.toGMTString();
}

function getCookie(cookieName) {
  var start = document.cookie.indexOf(cookieName + '=');
  if(start == -1) return '';
  var len = start + cookieName.length + 1;
  if((!start) && (cookieName != document.cookie.substring(0, cookieName.length))) return ''
  var end = document.cookie.indexOf(';', len);
  if(end == -1) end = document.cookie.length
  return unescape(document.cookie.substring(len, end));
}

function deleteCookie(cookieName) {
  if(getCookie(cookieName)) setCookie(cookieName,null,-365)
}