| 875 |
lars |
1 |
function strtotime (str, now) {
|
|
|
2 |
|
|
|
3 |
// Convert string representation of date and time to a timestamp
|
|
|
4 |
//
|
|
|
5 |
// version: 1109.2015
|
|
|
6 |
// discuss at: http://phpjs.org/functions/strtotime // + original by: Caio Ariede (http://caioariede.com)
|
|
|
7 |
// + improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
|
|
|
8 |
// + input by: David
|
|
|
9 |
// + improved by: Caio Ariede (http://caioariede.com)
|
|
|
10 |
// + improved by: Brett Zamir (http://brett-zamir.me) // + bugfixed by: Wagner B. Soares
|
|
|
11 |
// + bugfixed by: Artur Tchernychev
|
|
|
12 |
// % note 1: Examples all have a fixed timestamp to prevent tests to fail because of variable time(zones)
|
|
|
13 |
// * example 1: strtotime('+1 day', 1129633200);
|
|
|
14 |
// * returns 1: 1129719600 // * example 2: strtotime('+1 week 2 days 4 hours 2 seconds', 1129633200);
|
|
|
15 |
// * returns 2: 1130425202
|
|
|
16 |
// * example 3: strtotime('last month', 1129633200);
|
|
|
17 |
// * returns 3: 1127041200
|
|
|
18 |
// * example 4: strtotime('2009-05-04 08:30:00'); // * returns 4: 1241418600
|
|
|
19 |
var i, match, s, strTmp = '',
|
|
|
20 |
parse = '';
|
|
|
21 |
|
|
|
22 |
strTmp = str; strTmp = strTmp.replace(/\s{2,}|^\s|\s$/g, ' '); // unecessary spaces
|
|
|
23 |
strTmp = strTmp.replace(/[\t\r\n]/g, ''); // unecessary chars
|
|
|
24 |
if (strTmp == 'now') {
|
|
|
25 |
return (new Date()).getTime() / 1000; // Return seconds, not milli-seconds
|
|
|
26 |
} else if (!isNaN(parse = Date.parse(strTmp))) { return (parse / 1000);
|
|
|
27 |
} else if (now) {
|
|
|
28 |
now = new Date(now * 1000); // Accept PHP-style seconds
|
|
|
29 |
} else {
|
|
|
30 |
now = new Date(); }
|
|
|
31 |
|
|
|
32 |
strTmp = strTmp.toLowerCase();
|
|
|
33 |
|
|
|
34 |
var __is = { day: {
|
|
|
35 |
'sun': 0,
|
|
|
36 |
'mon': 1,
|
|
|
37 |
'tue': 2,
|
|
|
38 |
'wed': 3, 'thu': 4,
|
|
|
39 |
'fri': 5,
|
|
|
40 |
'sat': 6
|
|
|
41 |
},
|
|
|
42 |
mon: { 'jan': 0,
|
|
|
43 |
'feb': 1,
|
|
|
44 |
'mar': 2,
|
|
|
45 |
'apr': 3,
|
|
|
46 |
'may': 4, 'jun': 5,
|
|
|
47 |
'jul': 6,
|
|
|
48 |
'aug': 7,
|
|
|
49 |
'sep': 8,
|
|
|
50 |
'oct': 9, 'nov': 10,
|
|
|
51 |
'dec': 11
|
|
|
52 |
}
|
|
|
53 |
};
|
|
|
54 |
var process = function (m) {
|
|
|
55 |
var ago = (m[2] && m[2] == 'ago');
|
|
|
56 |
var num = (num = m[0] == 'last' ? -1 : 1) * (ago ? -1 : 1);
|
|
|
57 |
|
|
|
58 |
switch (m[0]) { case 'last':
|
|
|
59 |
case 'next':
|
|
|
60 |
switch (m[1].substring(0, 3)) {
|
|
|
61 |
case 'yea':
|
|
|
62 |
now.setFullYear(now.getFullYear() + num); break;
|
|
|
63 |
case 'mon':
|
|
|
64 |
now.setMonth(now.getMonth() + num);
|
|
|
65 |
break;
|
|
|
66 |
case 'wee': now.setDate(now.getDate() + (num * 7));
|
|
|
67 |
break;
|
|
|
68 |
case 'day':
|
|
|
69 |
now.setDate(now.getDate() + num);
|
|
|
70 |
break; case 'hou':
|
|
|
71 |
now.setHours(now.getHours() + num);
|
|
|
72 |
break;
|
|
|
73 |
case 'min':
|
|
|
74 |
now.setMinutes(now.getMinutes() + num); break;
|
|
|
75 |
case 'sec':
|
|
|
76 |
now.setSeconds(now.getSeconds() + num);
|
|
|
77 |
break;
|
|
|
78 |
default: var day;
|
|
|
79 |
if (typeof(day = __is.day[m[1].substring(0, 3)]) != 'undefined') {
|
|
|
80 |
var diff = day - now.getDay();
|
|
|
81 |
if (diff == 0) {
|
|
|
82 |
diff = 7 * num; } else if (diff > 0) {
|
|
|
83 |
if (m[0] == 'last') {
|
|
|
84 |
diff -= 7;
|
|
|
85 |
}
|
|
|
86 |
} else { if (m[0] == 'next') {
|
|
|
87 |
diff += 7;
|
|
|
88 |
}
|
|
|
89 |
}
|
|
|
90 |
now.setDate(now.getDate() + diff); }
|
|
|
91 |
}
|
|
|
92 |
break;
|
|
|
93 |
|
|
|
94 |
default: if (/\d+/.test(m[0])) {
|
|
|
95 |
num *= parseInt(m[0], 10);
|
|
|
96 |
|
|
|
97 |
switch (m[1].substring(0, 3)) {
|
|
|
98 |
case 'yea': now.setFullYear(now.getFullYear() + num);
|
|
|
99 |
break;
|
|
|
100 |
case 'mon':
|
|
|
101 |
now.setMonth(now.getMonth() + num);
|
|
|
102 |
break; case 'wee':
|
|
|
103 |
now.setDate(now.getDate() + (num * 7));
|
|
|
104 |
break;
|
|
|
105 |
case 'day':
|
|
|
106 |
now.setDate(now.getDate() + num); break;
|
|
|
107 |
case 'hou':
|
|
|
108 |
now.setHours(now.getHours() + num);
|
|
|
109 |
break;
|
|
|
110 |
case 'min': now.setMinutes(now.getMinutes() + num);
|
|
|
111 |
break;
|
|
|
112 |
case 'sec':
|
|
|
113 |
now.setSeconds(now.getSeconds() + num);
|
|
|
114 |
break; }
|
|
|
115 |
} else {
|
|
|
116 |
return false;
|
|
|
117 |
}
|
|
|
118 |
break; }
|
|
|
119 |
return true;
|
|
|
120 |
};
|
|
|
121 |
|
|
|
122 |
match = strTmp.match(/^(\d{2,4}-\d{2}-\d{2})(?:\s(\d{1,2}:\d{2}(:\d{2})?)?(?:\.(\d+))?)?$/); if (match != null) {
|
|
|
123 |
if (!match[2]) {
|
|
|
124 |
match[2] = '00:00:00';
|
|
|
125 |
} else if (!match[3]) {
|
|
|
126 |
match[2] += ':00'; }
|
|
|
127 |
|
|
|
128 |
s = match[1].split(/-/g);
|
|
|
129 |
|
|
|
130 |
for (i in __is.mon) { if (__is.mon[i] == s[1] - 1) {
|
|
|
131 |
s[1] = i;
|
|
|
132 |
}
|
|
|
133 |
}
|
|
|
134 |
s[0] = parseInt(s[0], 10);
|
|
|
135 |
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] + '';
|
|
|
136 |
return parseInt(this.strtotime(s[2] + ' ' + s[1] + ' ' + s[0] + ' ' + match[2]) + (match[4] ? match[4] / 1000 : ''), 10);
|
|
|
137 |
}
|
|
|
138 |
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)?';
|
|
|
139 |
|
|
|
140 |
match = strTmp.match(new RegExp(regex, 'gi')); // Brett: seems should be case insensitive per docs, so added 'i'
|
|
|
141 |
if (match == null) {
|
|
|
142 |
return false; }
|
|
|
143 |
|
|
|
144 |
for (i = 0; i < match.length; i++) {
|
|
|
145 |
if (!process(match[i].split(' '))) {
|
|
|
146 |
return false; }
|
|
|
147 |
}
|
|
|
148 |
|
|
|
149 |
return (now.getTime() / 1000);
|
|
|
150 |
}
|