Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- diff --git a/js/server/modules/@arangodb/aql.js b/js/server/modules/@arangodb/aql.js
- index 594f083..fd3dc3d 100644
- --- a/js/server/modules/@arangodb/aql.js
- +++ b/js/server/modules/@arangodb/aql.js
- @@ -4754,9 +4754,34 @@ function AQL_FAIL (message) {
- ////////////////////////////////////////////////////////////////////////////////
- /// @brief helper function for date creation
- +/// @brief creates a UTC date from the args, but adjusts it by the given
- +/// timezone offset to it
- ////////////////////////////////////////////////////////////////////////////////
- -function MAKE_DATE (args, func) {
- +function MAKE_DATE_LOCAL (date, value) {
- + var matches = /([zZ]|[+\-](\d+)(:(\d+))?)$/.exec(value);
- + if (! matches) {
- + // zulu time or no timezone specified
- + return date;
- + }
- +
- + var c = matches[1][0];
- + if (c === 'z' || c === 'Z') {
- + // zulu time
- + return date;
- + }
- + var offsetMinutes = parseInt(matches[2]) * 60 + parseInt(matches[4]);
- + if (c === '-') {
- + return new Date(date.getTime() - offsetMinutes * 60000);
- + }
- + return new Date(date.getTime() + offsetMinutes * 60000);
- +}
- +
- +////////////////////////////////////////////////////////////////////////////////
- +/// @brief helper function for date creation
- +////////////////////////////////////////////////////////////////////////////////
- +
- +function MAKE_DATE (args, forceZulu, func) {
- 'use strict';
- var weight;
- @@ -4781,12 +4806,19 @@ function MAKE_DATE (args, func) {
- }
- }
- - // detect invalid dates ("foo" -> "fooZ" -> getTime() == NaN)
- var date = new Date(args[0]);
- +
- + // detect invalid dates ("foo" -> "fooZ" -> getTime() == NaN)
- if (isNaN(date)) {
- WARN(func, INTERNAL.errors.ERROR_QUERY_INVALID_DATE_VALUE, func);
- return null;
- }
- +
- + if (! forceZulu) {
- + // we know that the date is valid already
- + date = MAKE_DATE_LOCAL(date, args[0]);
- + }
- +
- return date;
- }
- @@ -4855,7 +4887,7 @@ function AQL_DATE_TIMESTAMP () {
- 'use strict';
- try {
- - return MAKE_DATE(arguments, "DATE_TIMESTAMP").getTime();
- + return MAKE_DATE(arguments, true, "DATE_TIMESTAMP").getTime();
- }
- catch (err) {
- WARN("DATE_TIMESTAMP", INTERNAL.errors.ERROR_QUERY_INVALID_DATE_VALUE);
- @@ -4871,7 +4903,7 @@ function AQL_DATE_ISO8601 () {
- 'use strict';
- try {
- - return MAKE_DATE(arguments, "DATE_ISO8601").toISOString();
- + return MAKE_DATE(arguments, true, "DATE_ISO8601").toISOString();
- }
- catch (err) {
- WARN("DATE_ISO8601", INTERNAL.errors.ERROR_QUERY_INVALID_DATE_VALUE);
- @@ -4887,7 +4919,7 @@ function AQL_DATE_DAYOFWEEK (value) {
- 'use strict';
- try {
- - return MAKE_DATE([ value ], "DATE_DAYOFWEEK").getUTCDay();
- + return MAKE_DATE([ value ], false, "DATE_DAYOFWEEK").getUTCDay();
- }
- catch (err) {
- WARN("DATE_DAYOFWEEK", INTERNAL.errors.ERROR_QUERY_INVALID_DATE_VALUE);
- @@ -4903,7 +4935,7 @@ function AQL_DATE_YEAR (value) {
- 'use strict';
- try {
- - return MAKE_DATE([ value ], "DATE_YEAR").getUTCFullYear();
- + return MAKE_DATE([ value ], false, "DATE_YEAR").getUTCFullYear();
- }
- catch (err) {
- WARN("DATE_YEAR", INTERNAL.errors.ERROR_QUERY_INVALID_DATE_VALUE);
- @@ -4919,7 +4951,7 @@ function AQL_DATE_MONTH (value) {
- 'use strict';
- try {
- - return MAKE_DATE([ value ], "DATE_MONTH").getUTCMonth() + 1;
- + return MAKE_DATE([ value ], false, "DATE_MONTH").getUTCMonth() + 1;
- }
- catch (err) {
- WARN("DATE_MONTH", INTERNAL.errors.ERROR_QUERY_INVALID_DATE_VALUE);
- @@ -4935,7 +4967,7 @@ function AQL_DATE_DAY (value) {
- 'use strict';
- try {
- - return MAKE_DATE([ value ], "DATE_DAY").getUTCDate();
- + return MAKE_DATE([ value ], false, "DATE_DAY").getUTCDate();
- }
- catch (err) {
- WARN("DATE_DAY", INTERNAL.errors.ERROR_QUERY_INVALID_DATE_VALUE);
- @@ -4951,7 +4983,7 @@ function AQL_DATE_HOUR (value) {
- 'use strict';
- try {
- - return MAKE_DATE([ value ], "DATE_HOUR").getUTCHours();
- + return MAKE_DATE([ value ], false, "DATE_HOUR").getUTCHours();
- }
- catch (err) {
- WARN("DATE_HOUR", INTERNAL.errors.ERROR_QUERY_INVALID_DATE_VALUE);
- @@ -4967,7 +4999,7 @@ function AQL_DATE_MINUTE (value) {
- 'use strict';
- try {
- - return MAKE_DATE([ value ], "DATE_MINUTE").getUTCMinutes();
- + return MAKE_DATE([ value ], false, "DATE_MINUTE").getUTCMinutes();
- }
- catch (err) {
- WARN("DATE_MINUTE", INTERNAL.errors.ERROR_QUERY_INVALID_DATE_VALUE);
- @@ -4983,7 +5015,7 @@ function AQL_DATE_SECOND (value) {
- 'use strict';
- try {
- - return MAKE_DATE([ value ], "DATE_SECOND").getUTCSeconds();
- + return MAKE_DATE([ value ], false, "DATE_SECOND").getUTCSeconds();
- }
- catch (err) {
- WARN("DATE_SECOND", INTERNAL.errors.ERROR_QUERY_INVALID_DATE_VALUE);
- @@ -4999,7 +5031,7 @@ function AQL_DATE_MILLISECOND (value) {
- 'use strict';
- try {
- - return MAKE_DATE([ value ], "DATE_MILLISECOND").getUTCMilliseconds();
- + return MAKE_DATE([ value ], false, "DATE_MILLISECOND").getUTCMilliseconds();
- }
- catch (err) {
- WARN("DATE_MILLISECOND", INTERNAL.errors.ERROR_QUERY_INVALID_DATE_VALUE);
- @@ -5015,7 +5047,7 @@ function AQL_DATE_DAYOFYEAR (value) {
- 'use strict';
- try {
- - var date = MAKE_DATE([ value ], "DATE_DAYOFYEAR");
- + var date = MAKE_DATE([ value ], false, "DATE_DAYOFYEAR");
- var m = date.getUTCMonth();
- var d = date.getUTCDate();
- var ly = AQL_DATE_LEAPYEAR(date.getTime());
- @@ -5038,7 +5070,7 @@ function AQL_DATE_ISOWEEK (value) {
- 'use strict';
- try {
- - var date = MAKE_DATE([ value ], "DATE_ISOWEEK");
- + var date = MAKE_DATE([ value ], false, "DATE_ISOWEEK");
- date.setUTCHours(0, 0, 0, 0);
- date.setUTCDate(date.getUTCDate() + 4 - (date.getUTCDay() || 7));
- return Math.ceil((((date - Date.UTC(date.getUTCFullYear(), 0, 1)) / 864e5) + 1) / 7);
- @@ -5057,7 +5089,7 @@ function AQL_DATE_LEAPYEAR (value) {
- 'use strict';
- try {
- - var yr = MAKE_DATE([ value ], "DATE_LEAPYEAR").getUTCFullYear();
- + var yr = MAKE_DATE([ value ], false, "DATE_LEAPYEAR").getUTCFullYear();
- return ((yr % 4 === 0) && (yr % 100 !== 0)) || (yr % 400 === 0);
- }
- catch (err) {
- @@ -5073,7 +5105,7 @@ function AQL_DATE_QUARTER (value) {
- 'use strict';
- try {
- - return MAKE_DATE([ value ], "DATE_QUARTER").getUTCMonth() / 3 + 1 | 0;
- + return MAKE_DATE([ value ], false, "DATE_QUARTER").getUTCMonth() / 3 + 1 | 0;
- }
- catch (err) {
- WARN("DATE_QUARTER", INTERNAL.errors.ERROR_QUERY_INVALID_DATE_VALUE);
- @@ -5089,7 +5121,7 @@ function AQL_DATE_DAYS_IN_MONTH (value) {
- 'use strict';
- try {
- - var date = MAKE_DATE([ value ], "DATE_DAYS_IN_MONTH");
- + var date = MAKE_DATE([ value ], false, "DATE_DAYS_IN_MONTH");
- var month = date.getUTCMonth() + 1;
- var ly = AQL_DATE_LEAPYEAR(date.getTime());
- return daysInMonth[month === 2 && ly ? 0 : month];
- @@ -5111,7 +5143,7 @@ function DATE_CALC (value, amount, unit, func) {
- // TODO: check if isNaN? If called by AQL FOR-loop, should query throw
- // and terminate immediately, or return a bunch of 'null's? If it shall
- // stop, then best handled in MAKE_DATE() itself I guess.
- - var date = MAKE_DATE([ value ], func);
- + var date = MAKE_DATE([ value ], false, func);
- if (date === null) {
- WARN(func, INTERNAL.errors.ERROR_QUERY_INVALID_DATE_VALUE);
- @@ -5210,8 +5242,8 @@ function AQL_DATE_SUBTRACT (value, amount, unit) {
- function AQL_DATE_DIFF (value1, value2, unit, asFloat) {
- 'use strict';
- - var date1 = MAKE_DATE([ value1 ], "DATE_DIFF");
- - var date2 = MAKE_DATE([ value2 ], "DATE_DIFF");
- + var date1 = MAKE_DATE([ value1 ], false, "DATE_DIFF");
- + var date2 = MAKE_DATE([ value2 ], false, "DATE_DIFF");
- // Don't return any number if either or both dates are NaN.
- if (date1 === null || date2 === null) {
- // warning issued by MAKE_DATE() already (duplicate warnings in other date function calls???)
- @@ -5276,8 +5308,8 @@ function AQL_DATE_COMPARE (value1, value2, unitRangeStart, unitRangeEnd) {
- // TODO: Should we handle leap years, so leapling birthdays occur every year?
- // It may result in unexpected behavior if it's used for something else but
- // birthday checking however. Probably best to leave compensation up to user query.
- - var date1 = MAKE_DATE([ value1 ], "DATE_COMPARE");
- - var date2 = MAKE_DATE([ value2 ], "DATE_COMPARE");
- + var date1 = MAKE_DATE([ value1 ], false, "DATE_COMPARE");
- + var date2 = MAKE_DATE([ value2 ], false, "DATE_COMPARE");
- if (TYPEWEIGHT(date1) === TYPEWEIGHT_NULL || TYPEWEIGHT(date2) === TYPEWEIGHT_NULL) {
- return null;
- }
- @@ -5326,7 +5358,7 @@ var dateMapRegExp = [
- function AQL_DATE_FORMAT (value, format) {
- 'use strict';
- try {
- - var date = MAKE_DATE([ value ], "DATE_FORMAT");
- + var date = MAKE_DATE([ value ], false, "DATE_FORMAT");
- var dateStr = date.toISOString();
- var yr = date.getUTCFullYear();
- var offset = yr < 0 || yr > 9999 ? 3 : 0;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement