immutable-date-lib
Version:
make date immutable, keep code safe
256 lines (255 loc) • 8.79 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.dateToString = exports.toArray = exports.parseDate = exports.dateEqual = exports.timeEqual = exports.getDatePart = exports.getToday = exports.setMilliseconds = exports.addMilliseconds = exports.setDate = exports.addDays = exports.setMonths = exports.addMonths = exports.setFullYear = exports.addYears = exports.setHours = exports.addHours = exports.setMinutes = exports.addMinutes = exports.setSeconds = exports.addSeconds = exports.immutableDate = exports.getTimeSpan = void 0;
Date.prototype.chainSetFullYear = function (val) {
return setFullYear(this, val);
};
Date.prototype.chainSetMonth = function (val) {
return setMonths(this, val);
};
Date.prototype.chainSetDate = function (val) {
return setDate(this, val);
};
Date.prototype.chainSetHours = function (val) {
return setHours(this, val);
};
Date.prototype.chainSetMinutes = function (val) {
return setMinutes(this, val);
};
Date.prototype.chainSetSeconds = function (val) {
return setSeconds(this, val);
};
Date.prototype.chainSetMilliseconds = function (val) {
return setMilliseconds(this, val);
};
Date.prototype.addDays = function (val) {
return addDays(this, val);
};
Date.prototype.addYears = function (val) {
return addYears(this, val);
};
Date.prototype.addMonths = function (val) {
return addMonths(this, val);
};
Date.prototype.addHours = function (val) {
return addHours(this, val);
};
Date.prototype.addMinutes = function (val) {
return addMinutes(this, val);
};
Date.prototype.addSeconds = function (val) {
return addSeconds(this, val);
};
Date.prototype.dateToString = function (format) {
return dateToString(this, format);
};
Date.prototype.getTimeSpan = function (d) {
return getTimeSpan(this, d);
};
Date.prototype.getDatePart = function () {
return getDatePart(this);
};
Date.prototype.dateEqual = function (val, dateFormat = undefined) {
return dateEqual(this, val, undefined, dateFormat);
};
Date.prototype.timeEqual = function (val) {
return timeEqual(this, val);
};
Date.prototype.toArray = function () {
return toArray(this);
};
function getTimeSpan(date1, date2) {
let [d1, d2] = [new Date(date1), new Date(date2)];
if (d1 > d2) {
[d1, d2] = [d2, d1];
}
const ms = d2.getTime() - d1.getTime();
const totalSeconds = ms / 1000;
let totalMinutes = totalSeconds / 60;
const totalHours = totalMinutes / 60;
const totalDays = totalHours / 24;
let years = d2.getFullYear() - d1.getFullYear();
if (d1.addYears(years) > d2) {
years--;
}
let totalMonths = years * 12 + d2.getMonth() - d1.getMonth();
if (d1.addMonths(totalMonths) > d2) {
totalMonths--;
}
const result = { years, totalMonths, totalDays, totalHours, totalMinutes, totalSeconds };
return result;
}
exports.getTimeSpan = getTimeSpan;
function immutableDate(d = '') {
return d ? new Date(d) : new Date();
}
exports.immutableDate = immutableDate;
function addSeconds(d, val) {
const myDate = new Date(d);
myDate.setSeconds(myDate.getSeconds() + val);
return myDate;
}
exports.addSeconds = addSeconds;
function setSeconds(d, val) {
const date = new Date(d);
date.setSeconds(val);
return date;
}
exports.setSeconds = setSeconds;
function addMinutes(d, val) {
const myDate = new Date(d);
myDate.setMinutes(myDate.getMinutes() + val);
return myDate;
}
exports.addMinutes = addMinutes;
function setMinutes(d, val) {
const myDate = new Date(d);
myDate.setMinutes(val);
return myDate;
}
exports.setMinutes = setMinutes;
function addHours(d, val) {
const myDate = new Date(d);
myDate.setHours(myDate.getHours() + val);
return myDate;
}
exports.addHours = addHours;
function setHours(d, val) {
const myDate = new Date(d);
myDate.setHours(val);
return myDate;
}
exports.setHours = setHours;
function addYears(d, val) {
const myDate = new Date(d);
myDate.setFullYear(myDate.getFullYear() + val);
return myDate;
}
exports.addYears = addYears;
function setFullYear(d, val) {
const myDate = new Date(d);
myDate.setFullYear(val);
return myDate;
}
exports.setFullYear = setFullYear;
function addMonths(d, val) {
const myDate = new Date(d);
myDate.setMonth(myDate.getMonth() + val);
return myDate;
}
exports.addMonths = addMonths;
function setMonths(d, val) {
console.log(d);
console.log(val);
const myDate = new Date(d);
myDate.setMonth(val);
return myDate;
}
exports.setMonths = setMonths;
function addDays(d, val) {
const myDate = new Date(d);
myDate.setDate(myDate.getDate() + val);
return myDate;
}
exports.addDays = addDays;
function setDate(d, val) {
const myDate = new Date(d);
myDate.setDate(val);
return myDate;
}
exports.setDate = setDate;
function addMilliseconds(d, val) {
const myDate = new Date(d);
myDate.setMilliseconds(myDate.getMilliseconds() + val);
return myDate;
}
exports.addMilliseconds = addMilliseconds;
function setMilliseconds(d, val) {
const myDate = new Date(d);
myDate.setMilliseconds(val);
return myDate;
}
exports.setMilliseconds = setMilliseconds;
function getToday() {
return getDatePart(new Date());
}
exports.getToday = getToday;
function getDatePart(d) {
const myDate = new Date(d);
return new Date(myDate.toLocaleDateString());
}
exports.getDatePart = getDatePart;
function timeEqual(d1, d2) {
return new Date(d1).getTime() == new Date(d2).getTime();
}
exports.timeEqual = timeEqual;
function dateEqual(d1, d2, d1format = undefined, d2format = undefined) {
let date1 = d1format ? parseDate(d1, d1format) : new Date(d1);
let date2 = d2format ? parseDate(d2, d2format) : new Date(d2);
return date1.toLocaleDateString() === date2.toLocaleDateString();
}
exports.dateEqual = dateEqual;
function parseDate(s, format, isUtc = false) {
if (!s) {
throw Error('Invalid Date');
}
const arr = ['yyyy', 'MM', 'dd', 'hh', 'mm', 'ss'];
const indexArr = arr.map((x, i) => ({ key: arr[i], index: format.indexOf(x), val: 0 }));
const sorted = indexArr
.filter(x => x.index > -1)
.sort((x, y) => x.index < y.index ? -1 : x.index === y.index ? 0 : 1);
let start = sorted[0].index;
for (const k of sorted) {
const result = parseNumber(s, start, k.key.length);
k.val = result.val;
start = result.i;
}
const [year, month, date, hour, minute, second] = [indexArr[0].val, indexArr[1].val - 1, indexArr[2].val,
indexArr[3].val, indexArr[4].val, indexArr[5].val];
return isUtc ?
new Date(`${year}-${myToString(month, 2)}-${myToString(date, 2)}T${myToString(hour, 2)}:${myToString(minute, 2)}:${myToString(second, 2)}Z`)
: new Date(year, month, date, hour, minute, second);
}
exports.parseDate = parseDate;
function toArray(d) {
const myDate = new Date(d);
return [myDate.getFullYear(), myDate.getMonth() + 1, myDate.getDate(), myDate.getHours(), myDate.getMinutes(), myDate.getSeconds(), myDate.getMilliseconds()];
}
exports.toArray = toArray;
function dateToString(d, format = 'yyyy-MM-dd hh:mm:ss') {
const myDate = new Date(d);
const [year, month, date, hour, minute, second] = toArray(myDate);
let halfHour = hour % 12;
halfHour = halfHour === 0 ? 12 : halfHour;
const result = format
.replace('yyyy', year.toString())
.replace('MMM', myDate.toLocaleString('default', { month: 'long' }))
.replace('MM', myToString(month, 2))
.replace('ddd', myDate.toLocaleString('default', { weekday: 'long' }))
.replace('dd', myToString(date, 2))
.replace('HH', myToString(hour, 2))
.replace('hh', myToString(halfHour, 2))
.replace('h', halfHour.toString())
.replace('mm', myToString(minute, 2))
.replace('ss', myToString(second, 2))
.replace('tt', myDate.getHours() >= 12 ? 'pm' : 'am');
return result;
}
exports.dateToString = dateToString;
function myToString(n, length) {
let leadNumber = 1;
for (let i = 0; i < length; i++) {
leadNumber *= 10;
}
return (leadNumber + n).toString().substr(1);
}
function isNumber(c) {
return '0123456789'.indexOf(c) > -1;
}
function parseNumber(s, start, length) {
let i = start;
for (; i < start + length && isNumber(s[i]); i++) { }
const val = +s.substr(start, i - start);
for (; i < s.length && !isNumber(s[i]); i++) { }
return { val, i };
}