diff --git a/src/util.js b/src/util.js index bd49a9f6..5a5f02fe 100644 --- a/src/util.js +++ b/src/util.js @@ -131,7 +131,7 @@ util.cast = function cast(object, type) { case 'number': case 'Number': - return Number(object); + return Number(object.valueOf()); case 'string': case 'String': @@ -148,11 +148,9 @@ util.cast = function cast(object, type) { return new Date(object.valueOf()); } if (util.isString(object)) { - // parse ASP.Net Date pattern, - // for example '/Date(1198908717056)/' or '/Date(1198908717056-0700)/' - // code from http://momentjs.com/ match = ASPDateRegex.exec(object); if (match) { + // object is an ASP date return new Date(Number(match[1])); // parse number } else { @@ -176,11 +174,9 @@ util.cast = function cast(object, type) { return moment.clone(); } if (util.isString(object)) { - // parse ASP.Net Date pattern, - // for example '/Date(1198908717056)/' or '/Date(1198908717056-0700)/' - // code from http://momentjs.com/ match = ASPDateRegex.exec(object); if (match) { + // object is an ASP date return moment(Number(match[1])); // parse number } else { @@ -194,14 +190,24 @@ util.cast = function cast(object, type) { } case 'ISODate': - if (object instanceof Date) { + if (util.isNumber(object)) { + return new Date(object); + } + else if (object instanceof Date) { return object.toISOString(); } else if (moment.isMoment(object)) { return object.toDate().toISOString(); } - else if (util.isNumber(object) || util.isString(object)) { - return moment(object).toDate().toISOString(); + else if (util.isString(object)) { + match = ASPDateRegex.exec(object); + if (match) { + // object is an ASP date + return new Date(Number(match[1])).toISOString(); // parse number + } + else { + return new Date(object).toISOString(); // parse string + } } else { throw new Error( @@ -210,11 +216,23 @@ util.cast = function cast(object, type) { } case 'ASPDate': - if (object instanceof Date) { + if (util.isNumber(object)) { + return '/Date(' + object + ')/'; + } + else if (object instanceof Date) { return '/Date(' + object.valueOf() + ')/'; } - else if (util.isNumber(object) || util.isString(object)) { - return '/Date(' + moment(object).valueOf() + ')/'; + else if (util.isString(object)) { + match = ASPDateRegex.exec(object); + var value; + if (match) { + // object is an ASP date + value = new Date(Number(match[1])).valueOf(); // parse number + } + else { + value = new Date(object).valueOf(); // parse string + } + return '/Date(' + value + ')/'; } else { throw new Error( @@ -228,6 +246,9 @@ util.cast = function cast(object, type) { } }; +// parse ASP.Net Date pattern, +// for example '/Date(1198908717056)/' or '/Date(1198908717056-0700)/' +// code from http://momentjs.com/ var ASPDateRegex = /^\/?Date\((\-?\d+)/i; /**