User:BryghtShadow/strtotime.js

/* Source: https://github.com/kvz/phpjs/blob/e666d231c93d50d39ef5ada4d4c8a0916279659b/functions/datetime/strtotime.js */

function strtotime (str, now) { // http://kevin.vanzonneveld.net // +  original by: Caio Ariede (http://caioariede.com) // +  improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net) // +     input by: David // +  improved by: Caio Ariede (http://caioariede.com) // +  improved by: Brett Zamir (http://brett-zamir.me) // +  bugfixed by: Wagner B. Soares // +  bugfixed by: Artur Tchernychev // +  input by: wookie // %       note 1: Examples all have a fixed timestamp to prevent tests to fail because of variable time(zones) // *    example 1: strtotime('+1 day', 1129633200); // *    returns 1: 1129719600 // *    example 2: strtotime('+1 week 2 days 4 hours 2 seconds', 1129633200); // *    returns 2: 1130425202 // *    example 3: strtotime('last month', 1129633200); // *    returns 3: 1127041200 // *    example 4: strtotime('2009-05-04 08:30:00'); // *    returns 4: 1241418600 var i, l, match, s, parse = '';

str = (str + ).replace(/\s{2,}|^\s|\s$/g, ' ').replace(/[\t\r\n]/g, );; // unecessary spaces and chars

if (str === 'now') { return now === null || isNaN(now) ? new Date.getTime / 1000 | 0 : now | 0; } else if (!isNaN(parse = Date.parse(str))) { return parse / 1000 | 0; } else if (now) { now = new Date(now * 1000); // Accept PHP-style seconds } else { now = new Date; }

str = str.toLowerCase;

var __is = { day: { 'sun': 0, 'mon': 1, 'tue': 2, 'wed': 3, 'thu': 4, 'fri': 5, 'sat': 6 },   mon: [ 'jan', 'feb', 'mar', 'apr', 'may', 'jun', 'jul', 'aug', 'sep', 'oct', 'nov', 'dec' ] };

var process = function (m) { var ago = (m[2] && m[2] === 'ago'); var num = (num = m[0] === 'last' ? -1 : 1) * (ago ? -1 : 1);

switch (m[0]) { case 'last': case 'next': switch (m[1].substring(0, 3)) { case 'yea': now.setFullYear(now.getFullYear + num); break; case 'wee': now.setDate(now.getDate + (num * 7)); break; case 'day': now.setDate(now.getDate + num); break; case 'hou': now.setHours(now.getHours + num); break; case 'min': now.setMinutes(now.getMinutes + num); break; case 'sec': now.setSeconds(now.getSeconds + num); break; case 'mon': if (m[1] === "month") { now.setMonth(now.getMonth + num); break; }       // fall through default: var day = __is.day[m[1].substring(0, 3)]; if (typeof day !== 'undefined') { var diff = day - now.getDay; if (diff === 0) { diff = 7 * num; } else if (diff > 0) { if (m[0] === 'last') { diff -= 7; }         } else { if (m[0] === 'next') { diff += 7; }         }          now.setDate(now.getDate + diff); now.setHours(0, 0, 0, 0); // when jumping to a specific last/previous day of week, PHP sets the time to 00:00:00 }     }      break;

default: if (/\d+/.test(m[0])) { num *= parseInt(m[0], 10);

switch (m[1].substring(0, 3)) { case 'yea': now.setFullYear(now.getFullYear + num); break; case 'mon': now.setMonth(now.getMonth + num); break; case 'wee': now.setDate(now.getDate + (num * 7)); break; case 'day': now.setDate(now.getDate + num); break; case 'hou': now.setHours(now.getHours + num); break; case 'min': now.setMinutes(now.getMinutes + num); break; case 'sec': now.setSeconds(now.getSeconds + num); break; }     } else { return false; }     break; }   return true; };

match = str.match(/^(\d{2,4}-\d{2}-\d{2})(?:\s(\d{1,2}:\d{2}(:\d{2})?)?(?:\.(\d+))?)?$/); if (match !== null) { if (!match[2]) { match[2] = '00:00:00'; } else if (!match[3]) { match[2] += ':00'; }

s = match[1].split(/-/g);

s[1] = __is.mon[s[1] - 1] || s[1]; s[0] = +s[0];

s[0] = (s[0] >= 0 && s[0] <= 69) ? '20' + (s[0] < 10 ? '0' + s[0] : s[0] + '') : (s[0] >= 70 && s[0] <= 99) ? '19' + s[0] : s[0] + ''; return parseInt(this.strtotime(s[2] + ' ' + s[1] + ' ' + s[0] + ' ' + match[2]) + (match[4] ? match[4] / 1000 : ''), 10); }

var regex = '([+-]?\\d+\\s' + '(years?|months?|weeks?|days?|hours?|min|minutes?|sec|seconds?' + '|sun\\.?|sunday|mon\\.?|monday|tue\\.?|tuesday|wed\\.?|wednesday' + '|thu\\.?|thursday|fri\\.?|friday|sat\\.?|saturday)' + '|(last|next)\\s' + '(years?|months?|weeks?|days?|hours?|min|minutes?|sec|seconds?' + '|sun\\.?|sunday|mon\\.?|monday|tue\\.?|tuesday|wed\\.?|wednesday' + '|thu\\.?|thursday|fri\\.?|friday|sat\\.?|saturday))' + '(\\sago)?';

match = str.match(new RegExp(regex, 'gi')); // Brett: seems should be case insensitive per docs, so added 'i' if (match === null) { return false; }

for (i = 0, l = match.length; i < l; i++) { if (!process(match[i].split(' '))) { return false; } }

return now.getTime / 1000 | 0; }