spreadsheet
typeScript/javascript spreadsheet parser, with formulas.
git clone https://git.vogt.world/spreadsheet.git
Log | Files | README.md
← Commit log
commit
message
parsing 'Month DD' values for DATEVALUE
author
Ben Vogt <[email protected]>
date
2017-03-25 17:34:32
stats
4 file(s) changed, 430 insertions(+), 363 deletions(-)
files
README.md
src/RawFormulas/Date.ts
tests/DateFormulasTest.ts
tests/FormulasTest.ts
  1diff --git a/README.md b/README.md
  2index 929acf4..3189b28 100644
  3--- a/README.md
  4+++ b/README.md
  5@@ -67,4 +67,7 @@ Right now we're just using the number of days since 1900, but we should check th
  6 #### Verify that all N-times ({2,9}) are correct, and we're not parsing numbers too big.
  7 
  8 #### Many times I use `\s*` when I actaully mean `\s+`
  9-Or the are times when I mean "Feb 20 2019" or "Feb 20,2019", and either is correct.
 10\ No newline at end of file
 11+Or the are times when I mean "Feb 20 2019" or "Feb 20,2019", and either is correct.
 12+
 13+#### Use `startOf('year')` to zero out all dates before building them up.
 14+No current tests should change because of this but it should eliminate some edge cases.
 15diff --git a/src/RawFormulas/Date.ts b/src/RawFormulas/Date.ts
 16index 69bfedc..ffb5769 100644
 17--- a/src/RawFormulas/Date.ts
 18+++ b/src/RawFormulas/Date.ts
 19@@ -56,9 +56,9 @@ var DATE = function (...values) {
 20  * "1999/1/13 10:10:10pm"   DONE
 21  * "Sun Feb 09 2017"        DONE
 22  * "Sun 09 Feb 2017"        DONE
 23- * "Feb-2017"
 24+ * "Feb-2017"               DONE
 25+ * "Feb 22"                 DONE
 26  * "22-Feb"
 27- * "Feb 22"
 28  * "10-22"
 29  * "10/2022"
 30  * "Sun Mar 05 2017 10:40:26"
 31@@ -338,6 +338,23 @@ var DATEVALUE = function (...values) : number {
 32     }
 33   }
 34 
 35+
 36+  // Check Month DD
 37+  if (m === undefined) {
 38+    // For reference: https://regex101.com/r/hujaIk/7
 39+    var matches = dateString.match(/^\s*(january|february|march|april|may|june|july|august|september|october|november|december|jan|feb|mar|apr|jun|jul|aug|sep|oct|nov|dec)(,?\s*|\s*-?\/?\s*|\s*\.?\s+)(0?[1-9]|[1-2][0-9]|3[0-1])\s*$/i);
 40+    if (matches && matches.length === 4) {
 41+      var monthName = matches[1];
 42+      var days = parseInt(matches[3]) - 1; // Days are zero indexed.
 43+      var tmpMoment = moment.utc([moment.utc().year()]).startOf('year').month(monthName);
 44+      // If we're specifying more days than there are in this month
 45+      if (days > tmpMoment.daysInMonth() - 1) {
 46+        throw new CellError(VALUE_ERROR, "DATEVALUE parameter '" + dateString + "' cannot be parsed to date/time.");
 47+      }
 48+      m = tmpMoment.add({"days": days});
 49+    }
 50+  }
 51+
 52   // If we've not been able to parse the date by now, then we cannot parse it at all.
 53   if (m === undefined || !m.isValid()) {
 54     throw new CellError(VALUE_ERROR, "DATEVALUE parameter '" + dateString + "' cannot be parsed to date/time.");
 55diff --git a/tests/DateFormulasTest.ts b/tests/DateFormulasTest.ts
 56new file mode 100644
 57index 0000000..93af128
 58--- /dev/null
 59+++ b/tests/DateFormulasTest.ts
 60@@ -0,0 +1,403 @@
 61+
 62+import { DATE, DATEVALUE } from "../src/RawFormulas/RawFormulas"
 63+import * as ERRORS from "../src/Errors"
 64+import {assertEquals} from "./utils/Asserts"
 65+
 66+function catchAndAssertEquals(toExecute, expected) {
 67+  var toThrow = null;
 68+  try {
 69+    toExecute();
 70+    toThrow = true;
 71+  } catch (actualError) {
 72+    if (actualError.message != expected) {
 73+      console.log(expected, "not equal to", actualError.message);
 74+    }
 75+  }
 76+  if (toThrow) {
 77+    throw new Error("expected error: " + expected);
 78+  }
 79+}
 80+
 81+// Test DATE
 82+assertEquals(DATE(1900, 1, 1).toNumber(), 2);
 83+assertEquals(DATE(1900, 1, 2).toNumber(), 3);
 84+assertEquals(DATE(1900, 1, 4).toNumber(), 5);
 85+catchAndAssertEquals(function() {
 86+  DATE(1900, 0, 4);
 87+}, ERRORS.NUM_ERROR);
 88+catchAndAssertEquals(function() {
 89+  DATE(1900, 0, 5);
 90+}, ERRORS.NUM_ERROR);
 91+assertEquals(DATE(1992, 6, 24).toNumber(), 33779);
 92+assertEquals(DATE(2017, 2, 26).toNumber(), 42792);
 93+// Leap day stuff
 94+assertEquals(DATE(2004, 2, 28).toNumber(), 38045);
 95+assertEquals(DATE(2004, 2, 29).toNumber(), 38046);
 96+assertEquals(DATE(2004, 3, 1).toNumber(), 38047);
 97+// Overflow values
 98+assertEquals(DATE(1992, 6, 44).toNumber(), 33799);
 99+assertEquals(DATE(2, 33, 44).toNumber(), 1749);
100+assertEquals(DATE(1777, 33, 44).toNumber(), 650055);
101+assertEquals(DATE(1976, 2, -10).toNumber(), 27780);
102+assertEquals(DATE(-1900, 1, 1).toNumber(), 2);
103+
104+
105+
106+// Test DATEVALUE
107+// MM/DD/YYYY
108+assertEquals(DATEVALUE("6/24/92"), 33779);
109+assertEquals(DATEVALUE("6/24/1992"), 33779);
110+assertEquals(DATEVALUE("06/24/1992"), 33779);
111+assertEquals(DATEVALUE("1/01/1999"), 36161);
112+assertEquals(DATEVALUE("1/01/99"), 36161);
113+assertEquals(DATEVALUE("1/01/2222"), 117610);
114+assertEquals(DATEVALUE("9/02/1902"), 976);
115+assertEquals(DATEVALUE("9/2/1902"), 976);
116+assertEquals(DATEVALUE("11/3/4243"), 856071);
117+assertEquals(DATEVALUE("  04/19/1992  "), 33713);
118+assertEquals(DATEVALUE("5/20/1992"), 33744);
119+assertEquals(DATEVALUE("6/21/1992"), 33776);
120+assertEquals(DATEVALUE("9/29/1992"), 33876);
121+assertEquals(DATEVALUE("1/24/1992"), 33627);
122+assertEquals(DATEVALUE("12/21/1992"), 33959);
123+assertEquals(DATEVALUE("01/31/1992"), 33634);
124+assertEquals(DATEVALUE("1/13/1992"), 33616);
125+assertEquals(DATEVALUE("2/29/2004"), 38046);
126+assertEquals(DATEVALUE("2/28/2004"), 38045);
127+assertEquals(DATEVALUE("2/28/004"), 38045);
128+assertEquals(DATEVALUE("2/28/04"), 38045);
129+assertEquals(DATEVALUE("2/28/4"), 38045);
130+assertEquals(DATEVALUE("1/13/1999"), 36173);
131+assertEquals(DATEVALUE("01/13/1999"), 36173);
132+assertEquals(DATEVALUE("01/13/0999"), -329069);
133+assertEquals(DATEVALUE("01/13/1200"), -255656);
134+assertEquals(DATEVALUE("01/13/0029"), 47131);
135+assertEquals(DATEVALUE("01/13/0030"), 10971);
136+assertEquals(DATEVALUE("01/13/0044"), 16084);
137+assertEquals(DATEVALUE("01/13/0050"), 18276);
138+assertEquals(DATEVALUE("01/13/0097"), 35443);
139+assertEquals(DATEVALUE("01/13/0099"), 36173);
140+assertEquals(DATEVALUE("01/13/0000"), 36538);
141+assertEquals(DATEVALUE("01/13/0101"), -657057);
142+assertEquals(DATEVALUE("01/13/0100"), -657422);
143+assertEquals(DATEVALUE("12/31/100"), -657070);
144+assertEquals(DATEVALUE("11/10/122"), -649086);
145+assertEquals(DATEVALUE("1/22/2222"), 117631);
146+assertEquals(DATEVALUE("1/22/222"), -612854);
147+// YYYY/MM/DD
148+assertEquals(DATEVALUE("1992/6/24"), 33779);
149+assertEquals(DATEVALUE("1992/06/24"), 33779);
150+assertEquals(DATEVALUE("1999/1/01"), 36161);
151+assertEquals(DATEVALUE("2222/1/01"), 117610);
152+assertEquals(DATEVALUE("1902/9/02"), 976);
153+assertEquals(DATEVALUE("1902/9/2"), 976);
154+assertEquals(DATEVALUE("4243/11/3"), 856071);
155+assertEquals(DATEVALUE("  1992/04/19  "), 33713);
156+assertEquals(DATEVALUE("1992/5/20"), 33744);
157+assertEquals(DATEVALUE("1992/6/21"), 33776);
158+assertEquals(DATEVALUE("1992/9/29"), 33876);
159+assertEquals(DATEVALUE("1992/1/24"), 33627);
160+assertEquals(DATEVALUE("1992/12/21"), 33959);
161+assertEquals(DATEVALUE("1992/01/31"), 33634);
162+assertEquals(DATEVALUE("1992/1/13"), 33616);
163+assertEquals(DATEVALUE("2004/2/29"), 38046);
164+assertEquals(DATEVALUE("2004/2/28"), 38045);
165+assertEquals(DATEVALUE("1999/1/13"), 36173);
166+assertEquals(DATEVALUE("1999/01/13"), 36173);
167+assertEquals(DATEVALUE("0999/01/13"), -329069);
168+assertEquals(DATEVALUE("1200/01/13"), -255656);
169+assertEquals(DATEVALUE("0029/01/13"), 47131);
170+assertEquals(DATEVALUE("0030/01/13"), 10971);
171+assertEquals(DATEVALUE("0044/01/13"), 16084);
172+assertEquals(DATEVALUE("0050/01/13"), 18276);
173+assertEquals(DATEVALUE("0097/01/13"), 35443);
174+assertEquals(DATEVALUE("0099/01/13"), 36173);
175+assertEquals(DATEVALUE("0000/01/13"), 36538);
176+assertEquals(DATEVALUE("0101/01/13"), -657057);
177+assertEquals(DATEVALUE("0100/01/13"), -657422);
178+assertEquals(DATEVALUE("100/12/31"), -657070);
179+assertEquals(DATEVALUE("122/11/10"), -649086);
180+assertEquals(DATEVALUE("2222/1/22"), 117631);
181+assertEquals(DATEVALUE("222/1/22"), -612854);
182+catchAndAssertEquals(function() {
183+  DATEVALUE("2005/2/29");// Leap day on non-leap year.
184+}, ERRORS.VALUE_ERROR);
185+catchAndAssertEquals(function() {
186+  DATEVALUE("2005/1/44");// Out of range day for any month
187+}, ERRORS.VALUE_ERROR);
188+// YYYY/MM/DD HH(am|pm)
189+assertEquals(DATEVALUE("1992/6/24 00am"), 33779);
190+assertEquals(DATEVALUE("1992/06/24 01am "), 33779);
191+assertEquals(DATEVALUE("1999/1/01 02pm"), 36161);
192+assertEquals(DATEVALUE("2222/1/01 03pm"), 117610);
193+assertEquals(DATEVALUE("1902/9/02 12pm"), 976);
194+assertEquals(DATEVALUE("1902/9/2 12pm"), 976);
195+assertEquals(DATEVALUE("4243/11/3 12pm   "), 856071);
196+assertEquals(DATEVALUE("  1992/04/19   12pm   "), 33713);
197+assertEquals(DATEVALUE("1992/5/20 01am"), 33744);
198+assertEquals(DATEVALUE("1992/6/21  3pm"), 33776);
199+assertEquals(DATEVALUE("1992/9/29 3pm"), 33876);
200+assertEquals(DATEVALUE("1992/1/24 3pm"), 33627);
201+assertEquals(DATEVALUE("1992/12/21 3pm"), 33959);
202+assertEquals(DATEVALUE("1992/01/31 3pm"), 33634);
203+assertEquals(DATEVALUE("1992/1/13 3pm"), 33616);
204+assertEquals(DATEVALUE("2004/2/29 3pm"), 38046);
205+assertEquals(DATEVALUE("2004/2/28  3pm "), 38045);
206+assertEquals(DATEVALUE("1999/1/13 3pm"), 36173);
207+assertEquals(DATEVALUE("1999/01/13 3pm"), 36173);
208+assertEquals(DATEVALUE("0999/01/13 3pm"), -329069);
209+assertEquals(DATEVALUE("1200/01/13 3pm"), -255656);
210+assertEquals(DATEVALUE("0029/01/13 3pm"), 47131);
211+assertEquals(DATEVALUE("0030/01/13 3pm"), 10971);
212+assertEquals(DATEVALUE("0044/01/13 3pm"), 16084);
213+assertEquals(DATEVALUE("0050/01/13 3pm"), 18276);
214+assertEquals(DATEVALUE("0097/01/13 00pm"), 35443);
215+assertEquals(DATEVALUE("0099/01/13 3pm"), 36173);
216+assertEquals(DATEVALUE("0000/01/13 3pm"), 36538);
217+assertEquals(DATEVALUE("0101/01/13 3pm"), -657057);
218+assertEquals(DATEVALUE("0100/01/13 3pm"), -657422);
219+assertEquals(DATEVALUE("100/12/31 3pm"), -657070);
220+assertEquals(DATEVALUE("122/11/10 3pm"), -649086);
221+assertEquals(DATEVALUE("2222/1/22 3pm"), 117631);
222+assertEquals(DATEVALUE("222/1/22 3pm"), -612854);
223+catchAndAssertEquals(function() {
224+  DATEVALUE("2005/2/29 000pm");// Too many digits
225+}, ERRORS.VALUE_ERROR);
226+catchAndAssertEquals(function() {
227+  DATEVALUE("2001/2/2 13pm");// Hour out of range
228+}, ERRORS.VALUE_ERROR);
229+catchAndAssertEquals(function() {
230+  DATEVALUE("2005/2/29 11am");// Leap day on non-leap year.
231+}, ERRORS.VALUE_ERROR);
232+catchAndAssertEquals(function() {
233+  DATEVALUE("2005/1/44 11am");// Out of range day for any month
234+}, ERRORS.VALUE_ERROR);
235+// YYYY/MM/DD HH:mm
236+assertEquals(DATEVALUE("1992/6/24 00:00"), 33779);
237+assertEquals(DATEVALUE("1992/6/24 0:00"), 33779);
238+assertEquals(DATEVALUE("1992/6/24 10:10"), 33779);
239+assertEquals(DATEVALUE("1992/6/24 16:22"), 33779);
240+assertEquals(DATEVALUE("1992/6/24 25:10"), 33780);
241+assertEquals(DATEVALUE("1992/6/24 23:60"), 33780);
242+assertEquals(DATEVALUE("1992/6/24 24:00"), 33780);
243+assertEquals(DATEVALUE("1992/6/24 23:59"), 33779);
244+assertEquals(DATEVALUE("1999/1/13 10:11111111"), 43889);
245+assertEquals(DATEVALUE("1999/1/13 25000:22"), 37214);
246+assertEquals(DATEVALUE("1999/1/13 25000:    22"), 37214);
247+// YYYY/MM/DD HH:mm(am|pm)
248+assertEquals(DATEVALUE("1992/6/24 00:00am"), 33779);
249+assertEquals(DATEVALUE("1992/06/24 01:44am "), 33779);
250+assertEquals(DATEVALUE("1999/1/01 02:59pm"), 36161);
251+assertEquals(DATEVALUE("2222/1/01 03:33pm"), 117610);
252+assertEquals(DATEVALUE("1902/9/02 12:33pm"), 976);
253+assertEquals(DATEVALUE("1902/9/2 12:33pm"), 976);
254+assertEquals(DATEVALUE("4243/11/3 12:33pm"), 856071);
255+assertEquals(DATEVALUE("  1992/04/19   12:  33pm   "), 33713);
256+assertEquals(DATEVALUE("1992/5/20 01:33am"), 33744);
257+assertEquals(DATEVALUE("1992/6/21  3:33pm"), 33776);
258+assertEquals(DATEVALUE("1992/9/29 3:33pm"), 33876);
259+assertEquals(DATEVALUE("1992/1/24 3:33pm"), 33627);
260+assertEquals(DATEVALUE("1992/12/21 3:33pm"), 33959);
261+assertEquals(DATEVALUE("1992/01/31 3:33pm"), 33634);
262+assertEquals(DATEVALUE("1992/1/13 3:33pm"), 33616);
263+assertEquals(DATEVALUE("2004/2/29 3:33pm"), 38046);
264+assertEquals(DATEVALUE("2004/2/28  3:33pm "), 38045);
265+assertEquals(DATEVALUE("1999/1/13 3:33pm"), 36173);
266+assertEquals(DATEVALUE("1999/01/13 3:33pm"), 36173);
267+assertEquals(DATEVALUE("0999/01/13 3:33pm"), -329069);
268+assertEquals(DATEVALUE("1200/01/13 3:33pm"), -255656);
269+assertEquals(DATEVALUE("0029/01/13 3:33pm"), 47131);
270+assertEquals(DATEVALUE("0030/01/13 3:33pm"), 10971);
271+assertEquals(DATEVALUE("0044/01/13 3:33pm"), 16084);
272+assertEquals(DATEVALUE("0050/01/13 3:33pm"), 18276);
273+assertEquals(DATEVALUE("0097/01/13 00:33pm"), 35443);
274+assertEquals(DATEVALUE("0099/01/13 3:33pm"), 36173);
275+assertEquals(DATEVALUE("0000/01/13 3:33pm"), 36538);
276+assertEquals(DATEVALUE("0101/01/13 3:33pm"), -657057);
277+assertEquals(DATEVALUE("0100/01/13 3:33pm"), -657422);
278+assertEquals(DATEVALUE("100/12/31 3:33pm"), -657070);
279+assertEquals(DATEVALUE("122/11/10 3:33pm"), -649086);
280+assertEquals(DATEVALUE("2222/1/22 3:33pm"), 117631);
281+assertEquals(DATEVALUE("222/1/22 3:33pm"), -612854);
282+assertEquals(DATEVALUE("1992/1/13 6:22222222am"), 49048); // overload minutes
283+assertEquals(DATEVALUE("1992/1/13 12:720pm"), 33617); // overload minutes
284+assertEquals(DATEVALUE("1992/1/13 00:720pm"), 33617); // overload minutes
285+assertEquals(DATEVALUE("1992/1/13 12:719pm"), 33616); // overload minutes
286+assertEquals(DATEVALUE("1992/1/13 00:720am"), 33616); // overload minutes
287+assertEquals(DATEVALUE("1992/1/13 00:01pm"), 33616); // overload minutes
288+assertEquals(DATEVALUE("1992/1/13 12:66669pm"), 33662); // overload minutes
289+assertEquals(DATEVALUE("1992/1/13 12:66669am"), 33662); // overload minutes
290+assertEquals(DATEVALUE("1992/1/13 12:66249pm"), 33662); // overload minutes
291+assertEquals(DATEVALUE("1992/1/13 12:66249am"), 33662); // overload minutes
292+assertEquals(DATEVALUE("1992/1/13 12:666669am"), 34078); // overload minutes
293+assertEquals(DATEVALUE("1992/1/13 12:666669pm"), 34079); // overload minutes
294+assertEquals(DATEVALUE("1992/1/13 12:100000000am"), 103060); // overload minutes
295+assertEquals(DATEVALUE("1992/1/13 12:0912347287am"), 667190); // overload minutes
296+assertEquals(DATEVALUE("1992/1/13 12:00000912347287am"), 667190); // overload minutes
297+assertEquals(DATEVALUE("1992/1/13 12:1989198298am"), 1415003); // overload minutes
298+// YYYY/MM/DD HH:mm:ss
299+assertEquals(DATEVALUE("1992/6/24 0:0:0"), 33779);
300+assertEquals(DATEVALUE("1992/6/24 0000:0000:0000"), 33779);
301+assertEquals(DATEVALUE("0000/01/13 3:33:999999999"), 48112); // overload seconds
302+assertEquals(DATEVALUE("1992/1/13 6:22222222:0"), 49048); // overload minutes
303+assertEquals(DATEVALUE("1992/1/13 12:912347287:10"), 667191); // overload minutes
304+assertEquals(DATEVALUE("1992/1/13 12:100000000:10"), 103060); // overload minutes
305+assertEquals(DATEVALUE("1992/1/13 23:720:10"), 33617); // overload minutes
306+assertEquals(DATEVALUE("1992/1/13 23:719:60"), 33617); // overload minutes, seconds
307+assertEquals(DATEVALUE("1992/6/24 24:00:00"), 33780); // overload hours
308+assertEquals(DATEVALUE("1999/1/01 200000000:999999999:923231312"), 9074624); // overload hours, minutes, seconds
309+assertEquals(DATEVALUE("  1992/04/19   12:  33: 11  "), 33713);
310+assertEquals(DATEVALUE("0000/01/13 3:33:33"), 36538);
311+assertEquals(DATEVALUE("4243/11/3 200000000:33:444"), 9189404);
312+// YYYY/MM/DD HH:mm:ss(am|pm)
313+assertEquals(DATEVALUE("1999/1/13 10:10:10pm"), 36173);
314+assertEquals(DATEVALUE("1992/6/24 0:0:0pm"), 33779);
315+assertEquals(DATEVALUE("1992/6/24 00:0000:0000pm"), 33779);
316+assertEquals(DATEVALUE("0000/01/13 3:33:999999999pm"), 48112); // overload seconds
317+assertEquals(DATEVALUE("1992/1/13 6:22222222:0pm"), 49048); // overload minutes
318+assertEquals(DATEVALUE("1992/1/13 12:912347287:10pm"), 667191); // overload minutes
319+assertEquals(DATEVALUE("1992/1/13 12:100000000:10pm"), 103060); // overload minutes
320+assertEquals(DATEVALUE("1992/6/24 00:00:00am"), 33779);
321+assertEquals(DATEVALUE("1992/06/24 01:44:00am "), 33779);
322+assertEquals(DATEVALUE("1999/1/01 02:59:00pm"), 36161);
323+assertEquals(DATEVALUE("2222/1/01 03:33:00pm"), 117610);
324+assertEquals(DATEVALUE("1902/9/02 12:33:00pm"), 976);
325+assertEquals(DATEVALUE("1902/9/2 12:33:00pm"), 976);
326+assertEquals(DATEVALUE("4243/11/3 12:33:00pm"), 856071);
327+assertEquals(DATEVALUE("  1992/04/19   12:  33:  00  pm   "), 33713);
328+assertEquals(DATEVALUE("1992/5/20 01:33:44am"), 33744);
329+assertEquals(DATEVALUE("1992/6/21  3:33:44pm"), 33776);
330+assertEquals(DATEVALUE("1992/9/29 3:33:44pm"), 33876);
331+assertEquals(DATEVALUE("1992/1/24 3:33:44pm"), 33627);
332+assertEquals(DATEVALUE("1992/12/21 3:33:44pm"), 33959);
333+assertEquals(DATEVALUE("1992/01/31 3:33:44pm"), 33634);
334+assertEquals(DATEVALUE("1992/1/13 3:33:44pm"), 33616);
335+assertEquals(DATEVALUE("2004/2/29 3:33:44pm"), 38046);
336+assertEquals(DATEVALUE("2004/2/28  3:33:44pm "), 38045);
337+assertEquals(DATEVALUE("1999/1/13 3:33:44pm"), 36173);
338+assertEquals(DATEVALUE("1999/01/13 3:33:44pm"), 36173);
339+assertEquals(DATEVALUE("0999/01/13 3:33:44pm"), -329069);
340+assertEquals(DATEVALUE("1200/01/13 3:33:44pm"), -255656);
341+assertEquals(DATEVALUE("0029/01/13 3:33:44pm"), 47131);
342+assertEquals(DATEVALUE("0030/01/13 3:33:44pm"), 10971);
343+assertEquals(DATEVALUE("0044/01/13 3:33:44pm"), 16084);
344+assertEquals(DATEVALUE("0050/01/13 3:33:44pm"), 18276);
345+assertEquals(DATEVALUE("0097/01/13 00:33:44pm"), 35443);
346+assertEquals(DATEVALUE("0099/01/13 3:33:44pm"), 36173);
347+assertEquals(DATEVALUE("0000/01/13 3:33:44pm"), 36538);
348+assertEquals(DATEVALUE("0101/01/13 3:33:44pm"), -657057);
349+assertEquals(DATEVALUE("0100/01/13 3:33:44pm"), -657422);
350+assertEquals(DATEVALUE("100/12/31 3:33:44pm"), -657070);
351+assertEquals(DATEVALUE("122/11/10 3:33:44pm"), -649086);
352+assertEquals(DATEVALUE("2222/1/22 3:33:44pm"), 117631);
353+assertEquals(DATEVALUE("222/1/22 3:33:44pm"), -612854);
354+assertEquals(DATEVALUE("1992/1/13 6:22222222:44am"), 49048); // overload minutes
355+assertEquals(DATEVALUE("1992/1/13 12:720:00pm"), 33617); // overload minutes
356+assertEquals(DATEVALUE("1992/1/13 00:720:00pm"), 33617); // overload minutes
357+assertEquals(DATEVALUE("1992/1/13 12:719:00pm"), 33616); // overload minutes
358+assertEquals(DATEVALUE("1992/1/13 00:720:00am"), 33616); // overload minutes
359+assertEquals(DATEVALUE("1992/1/13 12:719:60pm"), 33617); // overload minutes
360+assertEquals(DATEVALUE("1992/1/13 00:720:00am"), 33616); // overload minutes
361+assertEquals(DATEVALUE("1992/1/13 00:01:00pm"), 33616); // overload minutes
362+assertEquals(DATEVALUE("1992/1/13 12:66669:00pm"), 33662); // overload minutes
363+assertEquals(DATEVALUE("1992/1/13 12:66669:00am"), 33662); // overload minutes
364+assertEquals(DATEVALUE("1992/1/13 12:66249:00pm"), 33662); // overload minutes
365+assertEquals(DATEVALUE("1992/1/13 12:66249:00am"), 33662); // overload minutes
366+assertEquals(DATEVALUE("1992/1/13 12:666669:00am"), 34078); // overload minutes
367+assertEquals(DATEVALUE("1992/1/13 12:666669:00pm"), 34079); // overload minutes
368+assertEquals(DATEVALUE("1992/1/13 12:100000000:00am"), 103060); // overload minutes
369+assertEquals(DATEVALUE("1992/1/13 12:912347287:00am"), 667190); // overload minutes
370+// (Dayname) Month DD YYYY
371+assertEquals(DATEVALUE("Sun Feb 09 2017"), 42775);
372+assertEquals(DATEVALUE("Sun Feb 9 2017"), 42775);
373+assertEquals(DATEVALUE("Mon Feb 09 2017"), 42775);
374+assertEquals(DATEVALUE("Thursday Feb 09 2017"), 42775);
375+assertEquals(DATEVALUE("Thursday February 09 2017"), 42775);
376+assertEquals(DATEVALUE("Sun September 01 20"), 44075);
377+assertEquals(DATEVALUE("Sun, Feb, 09, 2017"), 42775);
378+assertEquals(DATEVALUE("May 20 1992"), 33744);
379+assertEquals(DATEVALUE("December 31 100"), -657070);
380+assertEquals(DATEVALUE("January 13 0030"), 10971);
381+assertEquals(DATEVALUE("January 13 1200"), -255656);
382+assertEquals(DATEVALUE("January 22 2222"), 117631);
383+assertEquals(DATEVALUE("November 3 4243"), 856071);
384+assertEquals(DATEVALUE("Feb 29 2004"), 38046); // leap year, 29th ok
385+catchAndAssertEquals(function() {
386+  DATEVALUE("Feb 29 2001");// not leap year, 29th not ok
387+}, ERRORS.VALUE_ERROR);
388+catchAndAssertEquals(function() {
389+  DATEVALUE("June 32 2001");// overload numbers not ok
390+}, ERRORS.VALUE_ERROR);
391+// (Dayname) DD Month YYYY
392+assertEquals(DATEVALUE("Sun 09 Feb 2017"), 42775);
393+assertEquals(DATEVALUE("Sun 9 Feb 2017"), 42775);
394+assertEquals(DATEVALUE("Mon 09 Feb 2017"), 42775);
395+assertEquals(DATEVALUE("Thursday 09 Feb 2017"), 42775);
396+assertEquals(DATEVALUE("Thursday 09 February 2017"), 42775);
397+assertEquals(DATEVALUE("Sun 01 September 20"), 44075);
398+assertEquals(DATEVALUE("Sun, 09, Feb, 2017"), 42775);
399+assertEquals(DATEVALUE("20 May 1992"), 33744);
400+assertEquals(DATEVALUE("31 December 100"), -657070);
401+assertEquals(DATEVALUE("13 January 0030"), 10971);
402+assertEquals(DATEVALUE("13 January 1200"), -255656);
403+assertEquals(DATEVALUE("22 January 2222"), 117631);
404+assertEquals(DATEVALUE("3 November 4243"), 856071);
405+assertEquals(DATEVALUE("29 Feb 2004"), 38046); // leap year, 29th ok
406+catchAndAssertEquals(function() {
407+  DATEVALUE("29 Feb 2001");// not leap year, 29th not ok
408+}, ERRORS.VALUE_ERROR);
409+catchAndAssertEquals(function() {
410+  DATEVALUE("32 June 2001");// overload numbers not ok
411+}, ERRORS.VALUE_ERROR);
412+// Month YYYY
413+assertEquals(DATEVALUE("Jan 2017"), 42736);
414+assertEquals(DATEVALUE("Feb 2017"), 42767);
415+assertEquals(DATEVALUE("Mar 2017"), 42795);
416+assertEquals(DATEVALUE("Apr 2017"), 42826);
417+assertEquals(DATEVALUE("May 2017"), 42856);
418+assertEquals(DATEVALUE("Jun 2017"), 42887);
419+assertEquals(DATEVALUE("Jul 2017"), 42917);
420+assertEquals(DATEVALUE("Aug 2017"), 42948);
421+assertEquals(DATEVALUE("Sep 2017"), 42979);
422+assertEquals(DATEVALUE("Oct 2017"), 43009);
423+assertEquals(DATEVALUE("Nov 2017"), 43040);
424+assertEquals(DATEVALUE("Dec 2017"), 43070);
425+assertEquals(DATEVALUE("Feb, 2017"), 42767);
426+assertEquals(DATEVALUE("  Feb    2017  "), 42767);
427+assertEquals(DATEVALUE("Feb-2017"), 42767);
428+assertEquals(DATEVALUE("Feb.2017"), 42767);
429+assertEquals(DATEVALUE("Feb/2017"), 42767);
430+assertEquals(DATEVALUE("Feb    .    2017"), 42767);
431+assertEquals(DATEVALUE("Feb -      2017"), 42767);
432+assertEquals(DATEVALUE("January 0030"), 10959);
433+assertEquals(DATEVALUE("November 4243"), 856069);
434+assertEquals(DATEVALUE("December 0100"), -657100);
435+catchAndAssertEquals(function() {
436+  DATEVALUE("December 100");// need 4 digits
437+}, ERRORS.VALUE_ERROR);
438+// Month DD
439+// WARNING: Overriding Date prototype to lock in 'now' tests------------------------------------------------------------
440+Date.now = function() { return 1430462280860; }; // 2015-05-01T01:38:00.860
441+Date.prototype.getTime = Date.now;
442+// END WARNING----------------------------------------------------------------------------------------------------------
443+assertEquals(DATEVALUE("Jan 20"), 42024);
444+assertEquals(DATEVALUE("Feb 20"), 42055);
445+assertEquals(DATEVALUE("Mar 20"), 42083);
446+assertEquals(DATEVALUE("Apr 20"), 42114);
447+assertEquals(DATEVALUE("May 20"), 42144);
448+assertEquals(DATEVALUE("Jun 20"), 42175);
449+assertEquals(DATEVALUE("Jul 20"), 42205);
450+assertEquals(DATEVALUE("Aug 20"), 42236);
451+assertEquals(DATEVALUE("Sep 20"), 42267);
452+assertEquals(DATEVALUE("Oct 20"), 42297);
453+assertEquals(DATEVALUE("Nov 20"), 42328);
454+assertEquals(DATEVALUE("Dec 20"), 42358);
455+assertEquals(DATEVALUE("Dec. 20"), 42358);
456+assertEquals(DATEVALUE("Dec, 20"), 42358);
457+assertEquals(DATEVALUE("Dec/ 20"), 42358);
458+assertEquals(DATEVALUE("Dec- 20"), 42358);
459+assertEquals(DATEVALUE("Dec-20"), 42358);
460+assertEquals(DATEVALUE("June 2"), 42157);
461+catchAndAssertEquals(function() {
462+  DATEVALUE("Dec.20");// need space if using command, period
463+}, ERRORS.VALUE_ERROR);
464diff --git a/tests/FormulasTest.ts b/tests/FormulasTest.ts
465index d5a8f57..09ebb43 100644
466--- a/tests/FormulasTest.ts
467+++ b/tests/FormulasTest.ts
468@@ -1,3 +1,5 @@
469+/// <reference path="../node_modules/moment/moment.d.ts"/>
470+import * as moment from "moment";
471 import { ABS, ACCRINT, ACOS, ACOSH, ACOTH, AND, ARABIC, ASIN, ASINH, ATAN, ATAN2, ATANH, AVEDEV, AVERAGE,
472     AVERAGEA, AVERAGEIF, BIN2DEC, BIN2HEX, BIN2OCT, CEILING,
473     CHAR, CODE, COMBIN, CONCATENATE, CONVERT, PEARSON,
474@@ -757,366 +759,6 @@ catchAndAssertEquals(function() {
475 }, ERRORS.NA_ERROR);
476 
477 
478-// Test DATE
479-assertEquals(DATE(1900, 1, 1).toNumber(), 2);
480-assertEquals(DATE(1900, 1, 2).toNumber(), 3);
481-assertEquals(DATE(1900, 1, 4).toNumber(), 5);
482-catchAndAssertEquals(function() {
483-  DATE(1900, 0, 4);
484-}, ERRORS.NUM_ERROR);
485-catchAndAssertEquals(function() {
486-  DATE(1900, 0, 5);
487-}, ERRORS.NUM_ERROR);
488-assertEquals(DATE(1992, 6, 24).toNumber(), 33779);
489-assertEquals(DATE(2017, 2, 26).toNumber(), 42792);
490-// Leap day stuff
491-assertEquals(DATE(2004, 2, 28).toNumber(), 38045);
492-assertEquals(DATE(2004, 2, 29).toNumber(), 38046);
493-assertEquals(DATE(2004, 3, 1).toNumber(), 38047);
494-// Overflow values
495-assertEquals(DATE(1992, 6, 44).toNumber(), 33799);
496-assertEquals(DATE(2, 33, 44).toNumber(), 1749);
497-assertEquals(DATE(1777, 33, 44).toNumber(), 650055);
498-assertEquals(DATE(1976, 2, -10).toNumber(), 27780);
499-assertEquals(DATE(-1900, 1, 1).toNumber(), 2);
500-
501-
502-
503-// Test DATEVALUE
504-// MM/DD/YYYY
505-assertEquals(DATEVALUE("6/24/92"), 33779);
506-assertEquals(DATEVALUE("6/24/1992"), 33779);
507-assertEquals(DATEVALUE("06/24/1992"), 33779);
508-assertEquals(DATEVALUE("1/01/1999"), 36161);
509-assertEquals(DATEVALUE("1/01/99"), 36161);
510-assertEquals(DATEVALUE("1/01/2222"), 117610);
511-assertEquals(DATEVALUE("9/02/1902"), 976);
512-assertEquals(DATEVALUE("9/2/1902"), 976);
513-assertEquals(DATEVALUE("11/3/4243"), 856071);
514-assertEquals(DATEVALUE("  04/19/1992  "), 33713);
515-assertEquals(DATEVALUE("5/20/1992"), 33744);
516-assertEquals(DATEVALUE("6/21/1992"), 33776);
517-assertEquals(DATEVALUE("9/29/1992"), 33876);
518-assertEquals(DATEVALUE("1/24/1992"), 33627);
519-assertEquals(DATEVALUE("12/21/1992"), 33959);
520-assertEquals(DATEVALUE("01/31/1992"), 33634);
521-assertEquals(DATEVALUE("1/13/1992"), 33616);
522-assertEquals(DATEVALUE("2/29/2004"), 38046);
523-assertEquals(DATEVALUE("2/28/2004"), 38045);
524-assertEquals(DATEVALUE("2/28/004"), 38045);
525-assertEquals(DATEVALUE("2/28/04"), 38045);
526-assertEquals(DATEVALUE("2/28/4"), 38045);
527-assertEquals(DATEVALUE("1/13/1999"), 36173);
528-assertEquals(DATEVALUE("01/13/1999"), 36173);
529-assertEquals(DATEVALUE("01/13/0999"), -329069);
530-assertEquals(DATEVALUE("01/13/1200"), -255656);
531-assertEquals(DATEVALUE("01/13/0029"), 47131);
532-assertEquals(DATEVALUE("01/13/0030"), 10971);
533-assertEquals(DATEVALUE("01/13/0044"), 16084);
534-assertEquals(DATEVALUE("01/13/0050"), 18276);
535-assertEquals(DATEVALUE("01/13/0097"), 35443);
536-assertEquals(DATEVALUE("01/13/0099"), 36173);
537-assertEquals(DATEVALUE("01/13/0000"), 36538);
538-assertEquals(DATEVALUE("01/13/0101"), -657057);
539-assertEquals(DATEVALUE("01/13/0100"), -657422);
540-assertEquals(DATEVALUE("12/31/100"), -657070);
541-assertEquals(DATEVALUE("11/10/122"), -649086);
542-assertEquals(DATEVALUE("1/22/2222"), 117631);
543-assertEquals(DATEVALUE("1/22/222"), -612854);
544-// YYYY/MM/DD
545-assertEquals(DATEVALUE("1992/6/24"), 33779);
546-assertEquals(DATEVALUE("1992/06/24"), 33779);
547-assertEquals(DATEVALUE("1999/1/01"), 36161);
548-assertEquals(DATEVALUE("2222/1/01"), 117610);
549-assertEquals(DATEVALUE("1902/9/02"), 976);
550-assertEquals(DATEVALUE("1902/9/2"), 976);
551-assertEquals(DATEVALUE("4243/11/3"), 856071);
552-assertEquals(DATEVALUE("  1992/04/19  "), 33713);
553-assertEquals(DATEVALUE("1992/5/20"), 33744);
554-assertEquals(DATEVALUE("1992/6/21"), 33776);
555-assertEquals(DATEVALUE("1992/9/29"), 33876);
556-assertEquals(DATEVALUE("1992/1/24"), 33627);
557-assertEquals(DATEVALUE("1992/12/21"), 33959);
558-assertEquals(DATEVALUE("1992/01/31"), 33634);
559-assertEquals(DATEVALUE("1992/1/13"), 33616);
560-assertEquals(DATEVALUE("2004/2/29"), 38046);
561-assertEquals(DATEVALUE("2004/2/28"), 38045);
562-assertEquals(DATEVALUE("1999/1/13"), 36173);
563-assertEquals(DATEVALUE("1999/01/13"), 36173);
564-assertEquals(DATEVALUE("0999/01/13"), -329069);
565-assertEquals(DATEVALUE("1200/01/13"), -255656);
566-assertEquals(DATEVALUE("0029/01/13"), 47131);
567-assertEquals(DATEVALUE("0030/01/13"), 10971);
568-assertEquals(DATEVALUE("0044/01/13"), 16084);
569-assertEquals(DATEVALUE("0050/01/13"), 18276);
570-assertEquals(DATEVALUE("0097/01/13"), 35443);
571-assertEquals(DATEVALUE("0099/01/13"), 36173);
572-assertEquals(DATEVALUE("0000/01/13"), 36538);
573-assertEquals(DATEVALUE("0101/01/13"), -657057);
574-assertEquals(DATEVALUE("0100/01/13"), -657422);
575-assertEquals(DATEVALUE("100/12/31"), -657070);
576-assertEquals(DATEVALUE("122/11/10"), -649086);
577-assertEquals(DATEVALUE("2222/1/22"), 117631);
578-assertEquals(DATEVALUE("222/1/22"), -612854);
579-catchAndAssertEquals(function() {
580-  DATEVALUE("2005/2/29");// Leap day on non-leap year.
581-}, ERRORS.VALUE_ERROR);
582-catchAndAssertEquals(function() {
583-  DATEVALUE("2005/1/44");// Out of range day for any month
584-}, ERRORS.VALUE_ERROR);
585-// YYYY/MM/DD HH(am|pm)
586-assertEquals(DATEVALUE("1992/6/24 00am"), 33779);
587-assertEquals(DATEVALUE("1992/06/24 01am "), 33779);
588-assertEquals(DATEVALUE("1999/1/01 02pm"), 36161);
589-assertEquals(DATEVALUE("2222/1/01 03pm"), 117610);
590-assertEquals(DATEVALUE("1902/9/02 12pm"), 976);
591-assertEquals(DATEVALUE("1902/9/2 12pm"), 976);
592-assertEquals(DATEVALUE("4243/11/3 12pm   "), 856071);
593-assertEquals(DATEVALUE("  1992/04/19   12pm   "), 33713);
594-assertEquals(DATEVALUE("1992/5/20 01am"), 33744);
595-assertEquals(DATEVALUE("1992/6/21  3pm"), 33776);
596-assertEquals(DATEVALUE("1992/9/29 3pm"), 33876);
597-assertEquals(DATEVALUE("1992/1/24 3pm"), 33627);
598-assertEquals(DATEVALUE("1992/12/21 3pm"), 33959);
599-assertEquals(DATEVALUE("1992/01/31 3pm"), 33634);
600-assertEquals(DATEVALUE("1992/1/13 3pm"), 33616);
601-assertEquals(DATEVALUE("2004/2/29 3pm"), 38046);
602-assertEquals(DATEVALUE("2004/2/28  3pm "), 38045);
603-assertEquals(DATEVALUE("1999/1/13 3pm"), 36173);
604-assertEquals(DATEVALUE("1999/01/13 3pm"), 36173);
605-assertEquals(DATEVALUE("0999/01/13 3pm"), -329069);
606-assertEquals(DATEVALUE("1200/01/13 3pm"), -255656);
607-assertEquals(DATEVALUE("0029/01/13 3pm"), 47131);
608-assertEquals(DATEVALUE("0030/01/13 3pm"), 10971);
609-assertEquals(DATEVALUE("0044/01/13 3pm"), 16084);
610-assertEquals(DATEVALUE("0050/01/13 3pm"), 18276);
611-assertEquals(DATEVALUE("0097/01/13 00pm"), 35443);
612-assertEquals(DATEVALUE("0099/01/13 3pm"), 36173);
613-assertEquals(DATEVALUE("0000/01/13 3pm"), 36538);
614-assertEquals(DATEVALUE("0101/01/13 3pm"), -657057);
615-assertEquals(DATEVALUE("0100/01/13 3pm"), -657422);
616-assertEquals(DATEVALUE("100/12/31 3pm"), -657070);
617-assertEquals(DATEVALUE("122/11/10 3pm"), -649086);
618-assertEquals(DATEVALUE("2222/1/22 3pm"), 117631);
619-assertEquals(DATEVALUE("222/1/22 3pm"), -612854);
620-catchAndAssertEquals(function() {
621-  DATEVALUE("2005/2/29 000pm");// Too many digits
622-}, ERRORS.VALUE_ERROR);
623-catchAndAssertEquals(function() {
624-  DATEVALUE("2001/2/2 13pm");// Hour out of range
625-}, ERRORS.VALUE_ERROR);
626-catchAndAssertEquals(function() {
627-  DATEVALUE("2005/2/29 11am");// Leap day on non-leap year.
628-}, ERRORS.VALUE_ERROR);
629-catchAndAssertEquals(function() {
630-  DATEVALUE("2005/1/44 11am");// Out of range day for any month
631-}, ERRORS.VALUE_ERROR);
632-// YYYY/MM/DD HH:mm
633-assertEquals(DATEVALUE("1992/6/24 00:00"), 33779);
634-assertEquals(DATEVALUE("1992/6/24 0:00"), 33779);
635-assertEquals(DATEVALUE("1992/6/24 10:10"), 33779);
636-assertEquals(DATEVALUE("1992/6/24 16:22"), 33779);
637-assertEquals(DATEVALUE("1992/6/24 25:10"), 33780);
638-assertEquals(DATEVALUE("1992/6/24 23:60"), 33780);
639-assertEquals(DATEVALUE("1992/6/24 24:00"), 33780);
640-assertEquals(DATEVALUE("1992/6/24 23:59"), 33779);
641-assertEquals(DATEVALUE("1999/1/13 10:11111111"), 43889);
642-assertEquals(DATEVALUE("1999/1/13 25000:22"), 37214);
643-assertEquals(DATEVALUE("1999/1/13 25000:    22"), 37214);
644-// YYYY/MM/DD HH:mm(am|pm)
645-assertEquals(DATEVALUE("1992/6/24 00:00am"), 33779);
646-assertEquals(DATEVALUE("1992/06/24 01:44am "), 33779);
647-assertEquals(DATEVALUE("1999/1/01 02:59pm"), 36161);
648-assertEquals(DATEVALUE("2222/1/01 03:33pm"), 117610);
649-assertEquals(DATEVALUE("1902/9/02 12:33pm"), 976);
650-assertEquals(DATEVALUE("1902/9/2 12:33pm"), 976);
651-assertEquals(DATEVALUE("4243/11/3 12:33pm"), 856071);
652-assertEquals(DATEVALUE("  1992/04/19   12:  33pm   "), 33713);
653-assertEquals(DATEVALUE("1992/5/20 01:33am"), 33744);
654-assertEquals(DATEVALUE("1992/6/21  3:33pm"), 33776);
655-assertEquals(DATEVALUE("1992/9/29 3:33pm"), 33876);
656-assertEquals(DATEVALUE("1992/1/24 3:33pm"), 33627);
657-assertEquals(DATEVALUE("1992/12/21 3:33pm"), 33959);
658-assertEquals(DATEVALUE("1992/01/31 3:33pm"), 33634);
659-assertEquals(DATEVALUE("1992/1/13 3:33pm"), 33616);
660-assertEquals(DATEVALUE("2004/2/29 3:33pm"), 38046);
661-assertEquals(DATEVALUE("2004/2/28  3:33pm "), 38045);
662-assertEquals(DATEVALUE("1999/1/13 3:33pm"), 36173);
663-assertEquals(DATEVALUE("1999/01/13 3:33pm"), 36173);
664-assertEquals(DATEVALUE("0999/01/13 3:33pm"), -329069);
665-assertEquals(DATEVALUE("1200/01/13 3:33pm"), -255656);
666-assertEquals(DATEVALUE("0029/01/13 3:33pm"), 47131);
667-assertEquals(DATEVALUE("0030/01/13 3:33pm"), 10971);
668-assertEquals(DATEVALUE("0044/01/13 3:33pm"), 16084);
669-assertEquals(DATEVALUE("0050/01/13 3:33pm"), 18276);
670-assertEquals(DATEVALUE("0097/01/13 00:33pm"), 35443);
671-assertEquals(DATEVALUE("0099/01/13 3:33pm"), 36173);
672-assertEquals(DATEVALUE("0000/01/13 3:33pm"), 36538);
673-assertEquals(DATEVALUE("0101/01/13 3:33pm"), -657057);
674-assertEquals(DATEVALUE("0100/01/13 3:33pm"), -657422);
675-assertEquals(DATEVALUE("100/12/31 3:33pm"), -657070);
676-assertEquals(DATEVALUE("122/11/10 3:33pm"), -649086);
677-assertEquals(DATEVALUE("2222/1/22 3:33pm"), 117631);
678-assertEquals(DATEVALUE("222/1/22 3:33pm"), -612854);
679-assertEquals(DATEVALUE("1992/1/13 6:22222222am"), 49048); // overload minutes
680-assertEquals(DATEVALUE("1992/1/13 12:720pm"), 33617); // overload minutes
681-assertEquals(DATEVALUE("1992/1/13 00:720pm"), 33617); // overload minutes
682-assertEquals(DATEVALUE("1992/1/13 12:719pm"), 33616); // overload minutes
683-assertEquals(DATEVALUE("1992/1/13 00:720am"), 33616); // overload minutes
684-assertEquals(DATEVALUE("1992/1/13 00:01pm"), 33616); // overload minutes
685-assertEquals(DATEVALUE("1992/1/13 12:66669pm"), 33662); // overload minutes
686-assertEquals(DATEVALUE("1992/1/13 12:66669am"), 33662); // overload minutes
687-assertEquals(DATEVALUE("1992/1/13 12:66249pm"), 33662); // overload minutes
688-assertEquals(DATEVALUE("1992/1/13 12:66249am"), 33662); // overload minutes
689-assertEquals(DATEVALUE("1992/1/13 12:666669am"), 34078); // overload minutes
690-assertEquals(DATEVALUE("1992/1/13 12:666669pm"), 34079); // overload minutes
691-assertEquals(DATEVALUE("1992/1/13 12:100000000am"), 103060); // overload minutes
692-assertEquals(DATEVALUE("1992/1/13 12:0912347287am"), 667190); // overload minutes
693-assertEquals(DATEVALUE("1992/1/13 12:00000912347287am"), 667190); // overload minutes
694-assertEquals(DATEVALUE("1992/1/13 12:1989198298am"), 1415003); // overload minutes
695-// YYYY/MM/DD HH:mm:ss
696-assertEquals(DATEVALUE("1992/6/24 0:0:0"), 33779);
697-assertEquals(DATEVALUE("1992/6/24 0000:0000:0000"), 33779);
698-assertEquals(DATEVALUE("0000/01/13 3:33:999999999"), 48112); // overload seconds
699-assertEquals(DATEVALUE("1992/1/13 6:22222222:0"), 49048); // overload minutes
700-assertEquals(DATEVALUE("1992/1/13 12:912347287:10"), 667191); // overload minutes
701-assertEquals(DATEVALUE("1992/1/13 12:100000000:10"), 103060); // overload minutes
702-assertEquals(DATEVALUE("1992/1/13 23:720:10"), 33617); // overload minutes
703-assertEquals(DATEVALUE("1992/1/13 23:719:60"), 33617); // overload minutes, seconds
704-assertEquals(DATEVALUE("1992/6/24 24:00:00"), 33780); // overload hours
705-assertEquals(DATEVALUE("1999/1/01 200000000:999999999:923231312"), 9074624); // overload hours, minutes, seconds
706-assertEquals(DATEVALUE("  1992/04/19   12:  33: 11  "), 33713);
707-assertEquals(DATEVALUE("0000/01/13 3:33:33"), 36538);
708-assertEquals(DATEVALUE("4243/11/3 200000000:33:444"), 9189404);
709-// YYYY/MM/DD HH:mm:ss(am|pm)
710-assertEquals(DATEVALUE("1999/1/13 10:10:10pm"), 36173);
711-assertEquals(DATEVALUE("1992/6/24 0:0:0pm"), 33779);
712-assertEquals(DATEVALUE("1992/6/24 00:0000:0000pm"), 33779);
713-assertEquals(DATEVALUE("0000/01/13 3:33:999999999pm"), 48112); // overload seconds
714-assertEquals(DATEVALUE("1992/1/13 6:22222222:0pm"), 49048); // overload minutes
715-assertEquals(DATEVALUE("1992/1/13 12:912347287:10pm"), 667191); // overload minutes
716-assertEquals(DATEVALUE("1992/1/13 12:100000000:10pm"), 103060); // overload minutes
717-assertEquals(DATEVALUE("1992/6/24 00:00:00am"), 33779);
718-assertEquals(DATEVALUE("1992/06/24 01:44:00am "), 33779);
719-assertEquals(DATEVALUE("1999/1/01 02:59:00pm"), 36161);
720-assertEquals(DATEVALUE("2222/1/01 03:33:00pm"), 117610);
721-assertEquals(DATEVALUE("1902/9/02 12:33:00pm"), 976);
722-assertEquals(DATEVALUE("1902/9/2 12:33:00pm"), 976);
723-assertEquals(DATEVALUE("4243/11/3 12:33:00pm"), 856071);
724-assertEquals(DATEVALUE("  1992/04/19   12:  33:  00  pm   "), 33713);
725-assertEquals(DATEVALUE("1992/5/20 01:33:44am"), 33744);
726-assertEquals(DATEVALUE("1992/6/21  3:33:44pm"), 33776);
727-assertEquals(DATEVALUE("1992/9/29 3:33:44pm"), 33876);
728-assertEquals(DATEVALUE("1992/1/24 3:33:44pm"), 33627);
729-assertEquals(DATEVALUE("1992/12/21 3:33:44pm"), 33959);
730-assertEquals(DATEVALUE("1992/01/31 3:33:44pm"), 33634);
731-assertEquals(DATEVALUE("1992/1/13 3:33:44pm"), 33616);
732-assertEquals(DATEVALUE("2004/2/29 3:33:44pm"), 38046);
733-assertEquals(DATEVALUE("2004/2/28  3:33:44pm "), 38045);
734-assertEquals(DATEVALUE("1999/1/13 3:33:44pm"), 36173);
735-assertEquals(DATEVALUE("1999/01/13 3:33:44pm"), 36173);
736-assertEquals(DATEVALUE("0999/01/13 3:33:44pm"), -329069);
737-assertEquals(DATEVALUE("1200/01/13 3:33:44pm"), -255656);
738-assertEquals(DATEVALUE("0029/01/13 3:33:44pm"), 47131);
739-assertEquals(DATEVALUE("0030/01/13 3:33:44pm"), 10971);
740-assertEquals(DATEVALUE("0044/01/13 3:33:44pm"), 16084);
741-assertEquals(DATEVALUE("0050/01/13 3:33:44pm"), 18276);
742-assertEquals(DATEVALUE("0097/01/13 00:33:44pm"), 35443);
743-assertEquals(DATEVALUE("0099/01/13 3:33:44pm"), 36173);
744-assertEquals(DATEVALUE("0000/01/13 3:33:44pm"), 36538);
745-assertEquals(DATEVALUE("0101/01/13 3:33:44pm"), -657057);
746-assertEquals(DATEVALUE("0100/01/13 3:33:44pm"), -657422);
747-assertEquals(DATEVALUE("100/12/31 3:33:44pm"), -657070);
748-assertEquals(DATEVALUE("122/11/10 3:33:44pm"), -649086);
749-assertEquals(DATEVALUE("2222/1/22 3:33:44pm"), 117631);
750-assertEquals(DATEVALUE("222/1/22 3:33:44pm"), -612854);
751-assertEquals(DATEVALUE("1992/1/13 6:22222222:44am"), 49048); // overload minutes
752-assertEquals(DATEVALUE("1992/1/13 12:720:00pm"), 33617); // overload minutes
753-assertEquals(DATEVALUE("1992/1/13 00:720:00pm"), 33617); // overload minutes
754-assertEquals(DATEVALUE("1992/1/13 12:719:00pm"), 33616); // overload minutes
755-assertEquals(DATEVALUE("1992/1/13 00:720:00am"), 33616); // overload minutes
756-assertEquals(DATEVALUE("1992/1/13 12:719:60pm"), 33617); // overload minutes
757-assertEquals(DATEVALUE("1992/1/13 00:720:00am"), 33616); // overload minutes
758-assertEquals(DATEVALUE("1992/1/13 00:01:00pm"), 33616); // overload minutes
759-assertEquals(DATEVALUE("1992/1/13 12:66669:00pm"), 33662); // overload minutes
760-assertEquals(DATEVALUE("1992/1/13 12:66669:00am"), 33662); // overload minutes
761-assertEquals(DATEVALUE("1992/1/13 12:66249:00pm"), 33662); // overload minutes
762-assertEquals(DATEVALUE("1992/1/13 12:66249:00am"), 33662); // overload minutes
763-assertEquals(DATEVALUE("1992/1/13 12:666669:00am"), 34078); // overload minutes
764-assertEquals(DATEVALUE("1992/1/13 12:666669:00pm"), 34079); // overload minutes
765-assertEquals(DATEVALUE("1992/1/13 12:100000000:00am"), 103060); // overload minutes
766-assertEquals(DATEVALUE("1992/1/13 12:912347287:00am"), 667190); // overload minutes
767-// (Dayname) Month DD YYYY
768-assertEquals(DATEVALUE("Sun Feb 09 2017"), 42775);
769-assertEquals(DATEVALUE("Sun Feb 9 2017"), 42775);
770-assertEquals(DATEVALUE("Mon Feb 09 2017"), 42775);
771-assertEquals(DATEVALUE("Thursday Feb 09 2017"), 42775);
772-assertEquals(DATEVALUE("Thursday February 09 2017"), 42775);
773-assertEquals(DATEVALUE("Sun September 01 20"), 44075);
774-assertEquals(DATEVALUE("Sun, Feb, 09, 2017"), 42775);
775-assertEquals(DATEVALUE("May 20 1992"), 33744);
776-assertEquals(DATEVALUE("December 31 100"), -657070);
777-assertEquals(DATEVALUE("January 13 0030"), 10971);
778-assertEquals(DATEVALUE("January 13 1200"), -255656);
779-assertEquals(DATEVALUE("January 22 2222"), 117631);
780-assertEquals(DATEVALUE("November 3 4243"), 856071);
781-assertEquals(DATEVALUE("Feb 29 2004"), 38046); // leap year, 29th ok
782-catchAndAssertEquals(function() {
783-  DATEVALUE("Feb 29 2001");// not leap year, 29th not ok
784-}, ERRORS.VALUE_ERROR);
785-catchAndAssertEquals(function() {
786-  DATEVALUE("June 32 2001");// overload numbers not ok
787-}, ERRORS.VALUE_ERROR);
788-// (Dayname) DD Month YYYY
789-assertEquals(DATEVALUE("Sun 09 Feb 2017"), 42775);
790-assertEquals(DATEVALUE("Sun 9 Feb 2017"), 42775);
791-assertEquals(DATEVALUE("Mon 09 Feb 2017"), 42775);
792-assertEquals(DATEVALUE("Thursday 09 Feb 2017"), 42775);
793-assertEquals(DATEVALUE("Thursday 09 February 2017"), 42775);
794-assertEquals(DATEVALUE("Sun 01 September 20"), 44075);
795-assertEquals(DATEVALUE("Sun, 09, Feb, 2017"), 42775);
796-assertEquals(DATEVALUE("20 May 1992"), 33744);
797-assertEquals(DATEVALUE("31 December 100"), -657070);
798-assertEquals(DATEVALUE("13 January 0030"), 10971);
799-assertEquals(DATEVALUE("13 January 1200"), -255656);
800-assertEquals(DATEVALUE("22 January 2222"), 117631);
801-assertEquals(DATEVALUE("3 November 4243"), 856071);
802-assertEquals(DATEVALUE("29 Feb 2004"), 38046); // leap year, 29th ok
803-catchAndAssertEquals(function() {
804-  DATEVALUE("29 Feb 2001");// not leap year, 29th not ok
805-}, ERRORS.VALUE_ERROR);
806-catchAndAssertEquals(function() {
807-  DATEVALUE("32 June 2001");// overload numbers not ok
808-}, ERRORS.VALUE_ERROR);
809-// Month YYYY
810-assertEquals(DATEVALUE("Jan 2017"), 42736);
811-assertEquals(DATEVALUE("Feb 2017"), 42767);
812-assertEquals(DATEVALUE("Mar 2017"), 42795);
813-assertEquals(DATEVALUE("Apr 2017"), 42826);
814-assertEquals(DATEVALUE("May 2017"), 42856);
815-assertEquals(DATEVALUE("Jun 2017"), 42887);
816-assertEquals(DATEVALUE("Jul 2017"), 42917);
817-assertEquals(DATEVALUE("Aug 2017"), 42948);
818-assertEquals(DATEVALUE("Sep 2017"), 42979);
819-assertEquals(DATEVALUE("Oct 2017"), 43009);
820-assertEquals(DATEVALUE("Nov 2017"), 43040);
821-assertEquals(DATEVALUE("Dec 2017"), 43070);
822-assertEquals(DATEVALUE("Feb, 2017"), 42767);
823-assertEquals(DATEVALUE("  Feb    2017  "), 42767);
824-assertEquals(DATEVALUE("Feb-2017"), 42767);
825-assertEquals(DATEVALUE("Feb.2017"), 42767);
826-assertEquals(DATEVALUE("Feb/2017"), 42767);
827-assertEquals(DATEVALUE("Feb    .    2017"), 42767);
828-assertEquals(DATEVALUE("Feb -      2017"), 42767);
829-assertEquals(DATEVALUE("January 0030"), 10959);
830-assertEquals(DATEVALUE("November 4243"), 856069);
831-assertEquals(DATEVALUE("December 0100"), -657100);
832-catchAndAssertEquals(function() {
833-  DATEVALUE("December 100");// need 4 digits
834-}, ERRORS.VALUE_ERROR);
835-
836-
837-
838 // Test DB
839 assertEquals(DB(100, 50, 10, 2, 12), 6.2482428240683285);
840 assertEquals(DB("100", "50", "10", "2", "12"), 6.2482428240683285);