danfojs
Version:
JavaScript library providing high performance, intuitive, and easy to use data structures for manipulating and processing structured data.
246 lines (244 loc) • 8.78 kB
JavaScript
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
/**
* @license
* Copyright 2022 JsData. All rights reserved.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* ==========================================================================
*/
var utils_1 = __importDefault(require("../shared/utils"));
var utils = new utils_1.default();
var DateRange = /** @class */ (function () {
function DateRange(_a) {
var start = _a.start, end = _a.end, offset = _a.offset, freq = _a.freq, period = _a.period;
this.start = start;
this.end = end;
this.offset = offset;
this.freq = freq ? freq : "D";
this.period = period;
this.freqList = ["M", "D", "s", "H", "m", "Y"];
if (this.freq.length == 1) {
if (!this.freqList.includes(this.freq)) {
throw new Error("invalid freq " + this.freq);
}
}
else {
this.offset = parseInt(this.freq.slice(0, -1));
if (!Number.isFinite(this.offset)) {
throw new Error("invalid freq offset " + this.freq.slice(0, -1));
}
this.freq = this.freq.slice(-1);
if (!this.freqList.includes(this.freq)) {
throw new Error("invalid freq " + this.freq);
}
}
}
DateRange.prototype.range = function () {
var _this = this;
var start = this.start;
var period = this.period;
var end = this.end;
var offset = this.offset;
var startDate;
var endDate;
var startRange;
var endRange;
if (start && end) {
startDate = new Date(start);
startRange = this.freqType(startDate, this.freq);
endDate = new Date(end);
endRange = this.freqType(endDate, this.freq);
var startYear = startDate.getFullYear();
var endYear = endDate.getFullYear();
if ((startYear <= endYear) && (startDate.getMonth() !== endDate.getMonth())) {
if (this.freq == "M") {
endRange = this.monthEnd(startDate, endDate);
}
else if (this.freq === "D") {
endRange = this.dayEnd(startDate, endDate) - startRange;
}
}
var rangeArray_1 = utils.range(startRange, endRange);
if (offset) {
rangeArray_1 = this.offsetCount(rangeArray_1, offset);
}
var dateRange_1 = rangeArray_1.map(function (x) {
return _this.setDateProps(startDate, _this.freq, x);
});
dateRange_1[dateRange_1.length - 1] = endDate;
var dateString_1 = this.toLocalString(dateRange_1);
return dateString_1;
}
else if (start && !(end)) {
startDate = new Date(start);
startRange = this.freqType(startDate, this.freq);
period = period;
endRange = offset ? ((period * offset) - 1) : period - 1;
if (startRange > endRange) {
endRange = endRange + startRange;
}
var rangeArray_2 = utils.range(startRange, endRange);
if (offset) {
rangeArray_2 = this.offsetCount(rangeArray_2, offset);
}
var dateRange_2 = rangeArray_2.map(function (x) {
return _this.setDateProps(startDate, _this.freq, x);
});
var dateString_2 = this.toLocalString(dateRange_2);
return dateString_2;
}
// if end and not start given
endDate = new Date(end);
endRange = this.freqType(endDate, this.freq);
period = period;
startRange = (endRange - period) + 1;
var rangeArray = utils.range(startRange, endRange);
if (offset) {
rangeArray = this.offsetCount(rangeArray, offset);
}
var dateRange = rangeArray.map(function (x) {
return _this.setDateProps(endDate, _this.freq, x);
});
var dateString = this.toLocalString(dateRange);
return dateString;
};
/**
* @param date Date
* @param ftype string: frequency type, month, Year, day etc
* @param number
*/
DateRange.prototype.freqType = function (date, ftype) {
var rslt = 0;
switch (ftype) {
case "M":
rslt = date.getMonth();
break;
case "Y":
rslt = date.getFullYear();
break;
case "s":
rslt = date.getSeconds();
break;
case "D":
rslt = date.getDate();
break;
case "H":
rslt = date.getHours();
break;
case "m":
rslt = date.getMinutes();
break;
}
return rslt;
};
DateRange.prototype.offsetCount = function (dArray, offset) {
var rArray = [];
for (var i = 0; i < dArray.length; i += offset) {
rArray.push(dArray[i]);
}
return rArray;
};
DateRange.prototype.setDateProps = function (date, ftype, val) {
var newDate = new Date(date.valueOf());
switch (ftype) {
case "M":
if (Array.isArray(val)) {
newDate.setFullYear(newDate.getFullYear() + val[0]);
newDate.setMonth(val[1]);
}
else {
newDate.setMonth(val);
}
break;
case "Y":
newDate.setFullYear(val);
break;
case "s":
newDate.setSeconds(val);
break;
case "D":
newDate.setDate(val);
break;
case "H":
newDate.setHours(val);
break;
case "m":
newDate.setMinutes(val);
break;
}
return newDate;
};
DateRange.prototype.toLocalString = function (dArray) {
var r_array = dArray.map(function (x) {
return x.toLocaleString();
});
return r_array;
};
DateRange.prototype.monthEnd = function (startDate, endDate) {
var endMonth = endDate.getMonth();
var diffYear = endDate.getFullYear() - startDate.getFullYear();
var endRange = (12 * diffYear) + endMonth;
return endRange;
};
DateRange.prototype.monthRange = function (range) {
var minus;
var yVal = 0;
var dateRange = range.map(function (x) {
if (x > 11) {
if (x % 12 == 0) {
minus = x;
yVal = x / 12;
return [yVal, (x - minus)];
}
else {
return [yVal, (x - minus)];
}
}
return [yVal, x];
});
return dateRange;
};
DateRange.prototype.dayEnd = function (startDate, endDate) {
var monthEnd = this.monthEnd(startDate, endDate);
var range = utils.range(startDate.getMonth(), monthEnd);
var mRange = this.monthRange(range);
var sum = 0;
for (var i = 0; i < mRange.length; i++) {
var val = mRange[i];
var dDate = void 0;
if (i === mRange.length - 1) {
dDate = new Date(startDate.getUTCFullYear() + val[0], val[1], endDate.getDate()).getDate();
}
else {
dDate = new Date(startDate.getUTCFullYear() + val[0], val[1], 0).getDate();
}
sum += dDate;
}
return sum;
};
return DateRange;
}());
/**
* Generate sequence of Dates
* @param start : signify the date to start with
* @param end : signify the date to end with
* @param period : the total number of date to generate
* @param offset : set the date range offset
* @param freq: set the date range frequency and offset
* @return string[]
*/
function dateRange(param) {
var dateRange = new DateRange(param);
return dateRange.range();
}
exports.default = dateRange;