| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591 |
- /**
- * DevExtreme (core/utils/date.js)
- * Version: 19.1.16
- * Build date: Tue Oct 18 2022
- *
- * Copyright (c) 2012 - 2022 Developer Express Inc. ALL RIGHTS RESERVED
- * Read about DevExtreme licensing here: https://js.devexpress.com/Licensing/
- */
- "use strict";
- var typeUtils = require("./type");
- var adjust = require("./math").adjust;
- var each = require("./iterator").each;
- var camelize = require("./inflector").camelize;
- var isObject = typeUtils.isObject;
- var isString = typeUtils.isString;
- var isDate = typeUtils.isDate;
- var isDefined = typeUtils.isDefined;
- var dateUnitIntervals = ["millisecond", "second", "minute", "hour", "day", "week", "month", "quarter", "year"];
- var toMilliseconds = function toMilliseconds(value) {
- switch (value) {
- case "millisecond":
- return 1;
- case "second":
- return 1e3 * toMilliseconds("millisecond");
- case "minute":
- return 60 * toMilliseconds("second");
- case "hour":
- return 60 * toMilliseconds("minute");
- case "day":
- return 24 * toMilliseconds("hour");
- case "week":
- return 7 * toMilliseconds("day");
- case "month":
- return 30 * toMilliseconds("day");
- case "quarter":
- return 3 * toMilliseconds("month");
- case "year":
- return 365 * toMilliseconds("day");
- default:
- return 0
- }
- };
- var getDatesInterval = function(startDate, endDate, intervalUnit) {
- var delta = endDate.getTime() - startDate.getTime();
- var millisecondCount = toMilliseconds(intervalUnit) || 1;
- return Math.floor(delta / millisecondCount)
- };
- var getNextDateUnit = function(unit, withWeeks) {
- var interval = getDateUnitInterval(unit);
- switch (interval) {
- case "millisecond":
- return "second";
- case "second":
- return "minute";
- case "minute":
- return "hour";
- case "hour":
- return "day";
- case "day":
- return withWeeks ? "week" : "month";
- case "week":
- return "month";
- case "month":
- return "quarter";
- case "quarter":
- return "year";
- case "year":
- return "year";
- default:
- return 0
- }
- };
- var convertMillisecondsToDateUnits = function(value) {
- var dateUnitIntervals = ["millisecond", "second", "minute", "hour", "day", "month", "year"];
- var result = {};
- for (var i = dateUnitIntervals.length - 1; i >= 0; i--) {
- var dateUnitInterval = dateUnitIntervals[i];
- var dateUnitCount = Math.floor(value / toMilliseconds(dateUnitInterval));
- if (dateUnitCount > 0) {
- result[dateUnitInterval + "s"] = dateUnitCount;
- value -= convertDateUnitToMilliseconds(dateUnitInterval, dateUnitCount)
- }
- }
- return result
- };
- var dateToMilliseconds = function(tickInterval) {
- var milliseconds = 0;
- if (isObject(tickInterval)) {
- each(tickInterval, function(key, value) {
- milliseconds += convertDateUnitToMilliseconds(key.substr(0, key.length - 1), value)
- })
- }
- if (isString(tickInterval)) {
- milliseconds = convertDateUnitToMilliseconds(tickInterval, 1)
- }
- return milliseconds
- };
- var convertDateUnitToMilliseconds = function(dateUnit, count) {
- return toMilliseconds(dateUnit) * count
- };
- var getDateUnitInterval = function(tickInterval) {
- var maxInterval = -1;
- if (isString(tickInterval)) {
- return tickInterval
- }
- if (isObject(tickInterval)) {
- each(tickInterval, function(key, value) {
- for (var i = 0; i < dateUnitIntervals.length; i++) {
- if (value && (key === dateUnitIntervals[i] + "s" || key === dateUnitIntervals[i]) && maxInterval < i) {
- maxInterval = i
- }
- }
- });
- return dateUnitIntervals[maxInterval]
- }
- return ""
- };
- var tickIntervalToFormatMap = {
- millisecond: "millisecond",
- second: "longtime",
- minute: "shorttime",
- hour: "shorttime",
- day: "day",
- week: "day",
- month: "month",
- quarter: "quarter",
- year: "year"
- };
- function getDateFormatByTickInterval(tickInterval) {
- return tickIntervalToFormatMap[getDateUnitInterval(tickInterval)] || ""
- }
- var getQuarter = function(month) {
- return Math.floor(month / 3)
- };
- var getFirstQuarterMonth = function(month) {
- return 3 * getQuarter(month)
- };
- var correctDateWithUnitBeginning = function(date, dateInterval, withCorrection, firstDayOfWeek) {
- date = new Date(date.getTime());
- var oldDate = new Date(date.getTime());
- var dateUnitInterval = getDateUnitInterval(dateInterval);
- switch (dateUnitInterval) {
- case "second":
- date = new Date(1e3 * Math.floor(oldDate.getTime() / 1e3));
- break;
- case "minute":
- date = new Date(6e4 * Math.floor(oldDate.getTime() / 6e4));
- break;
- case "hour":
- date = new Date(36e5 * Math.floor(oldDate.getTime() / 36e5));
- break;
- case "year":
- date.setMonth(0);
- case "month":
- date.setDate(1);
- case "day":
- date.setHours(0, 0, 0, 0);
- break;
- case "week":
- date = getFirstWeekDate(date, firstDayOfWeek || 0);
- date.setHours(0, 0, 0, 0);
- break;
- case "quarter":
- var firstQuarterMonth = getFirstQuarterMonth(date.getMonth());
- var month = date.getMonth();
- date.setDate(1);
- date.setHours(0, 0, 0, 0);
- if (month !== firstQuarterMonth) {
- date.setMonth(firstQuarterMonth)
- }
- }
- if (withCorrection && "hour" !== dateUnitInterval && "minute" !== dateUnitInterval && "second" !== dateUnitInterval) {
- fixTimezoneGap(oldDate, date)
- }
- return date
- };
- var trimTime = function(date) {
- return dateUtils.correctDateWithUnitBeginning(date, "day")
- };
- var setToDayEnd = function(date) {
- var result = dateUtils.trimTime(date);
- result.setDate(result.getDate() + 1);
- return new Date(result.getTime() - 1)
- };
- var getDatesDifferences = function(date1, date2) {
- var counter = 0;
- var differences = {
- year: date1.getFullYear() !== date2.getFullYear(),
- month: date1.getMonth() !== date2.getMonth(),
- day: date1.getDate() !== date2.getDate(),
- hour: date1.getHours() !== date2.getHours(),
- minute: date1.getMinutes() !== date2.getMinutes(),
- second: date1.getSeconds() !== date2.getSeconds(),
- millisecond: date1.getMilliseconds() !== date2.getMilliseconds()
- };
- each(differences, function(key, value) {
- if (value) {
- counter++
- }
- });
- if (0 === counter && 0 !== getTimezonesDifference(date1, date2)) {
- differences.hour = true;
- counter++
- }
- differences.count = counter;
- return differences
- };
- function addDateInterval(value, interval, dir) {
- var result = new Date(value.getTime());
- var intervalObject = isString(interval) ? getDateIntervalByString(interval.toLowerCase()) : typeUtils.isNumeric(interval) ? convertMillisecondsToDateUnits(interval) : interval;
- if (intervalObject.years) {
- result.setFullYear(result.getFullYear() + intervalObject.years * dir)
- }
- if (intervalObject.quarters) {
- result.setMonth(result.getMonth() + 3 * intervalObject.quarters * dir)
- }
- if (intervalObject.months) {
- result.setMonth(result.getMonth() + intervalObject.months * dir)
- }
- if (intervalObject.weeks) {
- result.setDate(result.getDate() + 7 * intervalObject.weeks * dir)
- }
- if (intervalObject.days) {
- result.setDate(result.getDate() + intervalObject.days * dir)
- }
- if (intervalObject.hours) {
- result.setTime(result.getTime() + 36e5 * intervalObject.hours * dir)
- }
- if (intervalObject.minutes) {
- result.setTime(result.getTime() + 6e4 * intervalObject.minutes * dir)
- }
- if (intervalObject.seconds) {
- result.setTime(result.getTime() + 1e3 * intervalObject.seconds * dir)
- }
- if (intervalObject.milliseconds) {
- result.setTime(result.getTime() + intervalObject.milliseconds * dir)
- }
- return result
- }
- var addInterval = function(value, interval, isNegative) {
- var dir = isNegative ? -1 : 1;
- return isDate(value) ? addDateInterval(value, interval, dir) : adjust(value + interval * dir, interval)
- };
- var getSequenceByInterval = function(min, max, interval) {
- var intervals = [];
- var cur;
- intervals.push(isDate(min) ? new Date(min.getTime()) : min);
- cur = min;
- while (cur < max) {
- cur = addInterval(cur, interval);
- intervals.push(cur)
- }
- return intervals
- };
- var getViewFirstCellDate = function(viewType, date) {
- if ("month" === viewType) {
- return new Date(date.getFullYear(), date.getMonth(), 1)
- }
- if ("year" === viewType) {
- return new Date(date.getFullYear(), 0, date.getDate())
- }
- if ("decade" === viewType) {
- return new Date(getFirstYearInDecade(date), date.getMonth(), date.getDate())
- }
- if ("century" === viewType) {
- return new Date(getFirstDecadeInCentury(date), date.getMonth(), date.getDate())
- }
- };
- var getViewLastCellDate = function(viewType, date) {
- if ("month" === viewType) {
- return new Date(date.getFullYear(), date.getMonth(), getLastMonthDay(date))
- }
- if ("year" === viewType) {
- return new Date(date.getFullYear(), 11, date.getDate())
- }
- if ("decade" === viewType) {
- return new Date(getFirstYearInDecade(date) + 9, date.getMonth(), date.getDate())
- }
- if ("century" === viewType) {
- return new Date(getFirstDecadeInCentury(date) + 90, date.getMonth(), date.getDate())
- }
- };
- var getViewMinBoundaryDate = function(viewType, date) {
- var resultDate = new Date(date.getFullYear(), date.getMonth(), 1);
- if ("month" === viewType) {
- return resultDate
- }
- resultDate.setMonth(0);
- if ("year" === viewType) {
- return resultDate
- }
- if ("decade" === viewType) {
- resultDate.setFullYear(getFirstYearInDecade(date))
- }
- if ("century" === viewType) {
- resultDate.setFullYear(getFirstDecadeInCentury(date))
- }
- return resultDate
- };
- var getViewMaxBoundaryDate = function(viewType, date) {
- var resultDate = new Date(date);
- resultDate.setDate(getLastMonthDay(date));
- if ("month" === viewType) {
- return resultDate
- }
- resultDate.setMonth(11);
- resultDate.setDate(getLastMonthDay(resultDate));
- if ("year" === viewType) {
- return resultDate
- }
- if ("decade" === viewType) {
- resultDate.setFullYear(getFirstYearInDecade(date) + 9)
- }
- if ("century" === viewType) {
- resultDate.setFullYear(getFirstDecadeInCentury(date) + 99)
- }
- return resultDate
- };
- var getLastMonthDay = function(date) {
- var resultDate = new Date(date.getFullYear(), date.getMonth() + 1, 0);
- return resultDate.getDate()
- };
- var sameView = function(view, date1, date2) {
- return dateUtils[camelize("same " + view)](date1, date2)
- };
- var getViewUp = function(typeView) {
- switch (typeView) {
- case "month":
- return "year";
- case "year":
- return "decade";
- case "decade":
- return "century"
- }
- };
- var getViewDown = function(typeView) {
- switch (typeView) {
- case "century":
- return "decade";
- case "decade":
- return "year";
- case "year":
- return "month"
- }
- };
- var getDifferenceInMonth = function(typeView) {
- var difference = 1;
- if ("year" === typeView) {
- difference = 12
- }
- if ("decade" === typeView) {
- difference = 120
- }
- if ("century" === typeView) {
- difference = 1200
- }
- return difference
- };
- var getDifferenceInMonthForCells = function(typeView) {
- var difference = 1;
- if ("decade" === typeView) {
- difference = 12
- }
- if ("century" === typeView) {
- difference = 120
- }
- return difference
- };
- var getDateIntervalByString = function(intervalString) {
- var result = {};
- switch (intervalString) {
- case "year":
- result.years = 1;
- break;
- case "month":
- result.months = 1;
- break;
- case "quarter":
- result.months = 3;
- break;
- case "week":
- result.weeks = 1;
- break;
- case "day":
- result.days = 1;
- break;
- case "hour":
- result.hours = 1;
- break;
- case "minute":
- result.minutes = 1;
- break;
- case "second":
- result.seconds = 1;
- break;
- case "millisecond":
- result.milliseconds = 1
- }
- return result
- };
- var sameDate = function(date1, date2) {
- return sameMonthAndYear(date1, date2) && date1.getDate() === date2.getDate()
- };
- var sameMonthAndYear = function(date1, date2) {
- return sameYear(date1, date2) && date1.getMonth() === date2.getMonth()
- };
- var sameYear = function(date1, date2) {
- return date1 && date2 && date1.getFullYear() === date2.getFullYear()
- };
- var sameDecade = function(date1, date2) {
- if (!isDefined(date1) || !isDefined(date2)) {
- return
- }
- var startDecadeDate1 = date1.getFullYear() - date1.getFullYear() % 10;
- var startDecadeDate2 = date2.getFullYear() - date2.getFullYear() % 10;
- return date1 && date2 && startDecadeDate1 === startDecadeDate2
- };
- var sameCentury = function(date1, date2) {
- if (!isDefined(date1) || !isDefined(date2)) {
- return
- }
- var startCenturyDate1 = date1.getFullYear() - date1.getFullYear() % 100;
- var startCenturyDate2 = date2.getFullYear() - date2.getFullYear() % 100;
- return date1 && date2 && startCenturyDate1 === startCenturyDate2
- };
- var getFirstDecadeInCentury = function(date) {
- return date && date.getFullYear() - date.getFullYear() % 100
- };
- var getFirstYearInDecade = function(date) {
- return date && date.getFullYear() - date.getFullYear() % 10
- };
- var getShortDateFormat = function() {
- return "yyyy/MM/dd"
- };
- var getFirstMonthDate = function(date) {
- if (!isDefined(date)) {
- return
- }
- var newDate = new Date(date.getFullYear(), date.getMonth(), 1);
- return newDate
- };
- var getLastMonthDate = function(date) {
- if (!isDefined(date)) {
- return
- }
- var newDate = new Date(date.getFullYear(), date.getMonth() + 1, 0);
- return newDate
- };
- var getFirstWeekDate = function(date, firstDayOfWeek) {
- var delta = (date.getDay() - firstDayOfWeek + 7) % 7;
- var result = new Date(date);
- result.setDate(date.getDate() - delta);
- return result
- };
- var normalizeDateByWeek = function(date, currentDate) {
- var differenceInDays = dateUtils.getDatesInterval(date, currentDate, "day");
- var resultDate = new Date(date);
- if (differenceInDays >= 6) {
- resultDate = new Date(resultDate.setDate(resultDate.getDate() + 7))
- }
- return resultDate
- };
- var dateInRange = function(date, min, max, format) {
- if ("date" === format) {
- min = min && dateUtils.correctDateWithUnitBeginning(min, "day");
- max = max && dateUtils.correctDateWithUnitBeginning(max, "day");
- date = date && dateUtils.correctDateWithUnitBeginning(date, "day")
- }
- return normalizeDate(date, min, max) === date
- };
- var dateTimeFromDecimal = function(number) {
- var hours = Math.floor(number);
- var minutes = number % 1 * 60;
- return {
- hours: hours,
- minutes: minutes
- }
- };
- var roundDateByStartDayHour = function(date, startDayHour) {
- var startTime = this.dateTimeFromDecimal(startDayHour);
- var result = new Date(date);
- if (date.getHours() === startTime.hours && date.getMinutes() < startTime.minutes || date.getHours() < startTime.hours) {
- result.setHours(startTime.hours, startTime.minutes, 0, 0)
- }
- return result
- };
- var normalizeDate = function(date, min, max) {
- var normalizedDate = date;
- if (!isDefined(date)) {
- return date
- }
- if (isDefined(min) && date < min) {
- normalizedDate = min
- }
- if (isDefined(max) && date > max) {
- normalizedDate = max
- }
- return normalizedDate
- };
- var fixTimezoneGap = function(oldDate, newDate) {
- if (!isDefined(oldDate)) {
- return
- }
- var diff = newDate.getHours() - oldDate.getHours();
- if (0 === diff) {
- return
- }
- var sign = 1 === diff || diff === -23 ? -1 : 1;
- var trial = new Date(newDate.getTime() + 36e5 * sign);
- if (sign > 0 || trial.getDate() === newDate.getDate()) {
- newDate.setTime(trial.getTime())
- }
- };
- var roundToHour = function(date) {
- date.setHours(date.getHours() + 1);
- date.setMinutes(0);
- return date
- };
- var getTimezonesDifference = function(min, max) {
- return 60 * (max.getTimezoneOffset() - min.getTimezoneOffset()) * 1e3
- };
- var makeDate = function(date) {
- return new Date(date)
- };
- var getDatesOfInterval = function(startDate, endDate, step) {
- var result = [];
- var currentDate = new Date(startDate.getTime());
- if (startDate.getTime() === endDate.getTime()) {
- result.push(new Date(startDate.getTime()))
- }
- while (currentDate < endDate) {
- result.push(new Date(currentDate.getTime()));
- currentDate = this.addInterval(currentDate, step)
- }
- return result
- };
- var dateUtils = {
- dateUnitIntervals: dateUnitIntervals,
- convertMillisecondsToDateUnits: convertMillisecondsToDateUnits,
- dateToMilliseconds: dateToMilliseconds,
- getNextDateUnit: getNextDateUnit,
- convertDateUnitToMilliseconds: convertDateUnitToMilliseconds,
- getDateUnitInterval: getDateUnitInterval,
- getDateFormatByTickInterval: getDateFormatByTickInterval,
- getDatesDifferences: getDatesDifferences,
- correctDateWithUnitBeginning: correctDateWithUnitBeginning,
- trimTime: trimTime,
- setToDayEnd: setToDayEnd,
- roundDateByStartDayHour: roundDateByStartDayHour,
- dateTimeFromDecimal: dateTimeFromDecimal,
- addDateInterval: addDateInterval,
- addInterval: addInterval,
- getSequenceByInterval: getSequenceByInterval,
- getDateIntervalByString: getDateIntervalByString,
- sameDate: sameDate,
- sameMonthAndYear: sameMonthAndYear,
- sameMonth: sameMonthAndYear,
- sameYear: sameYear,
- sameDecade: sameDecade,
- sameCentury: sameCentury,
- sameView: sameView,
- getDifferenceInMonth: getDifferenceInMonth,
- getDifferenceInMonthForCells: getDifferenceInMonthForCells,
- getFirstYearInDecade: getFirstYearInDecade,
- getFirstDecadeInCentury: getFirstDecadeInCentury,
- getShortDateFormat: getShortDateFormat,
- getViewFirstCellDate: getViewFirstCellDate,
- getViewLastCellDate: getViewLastCellDate,
- getViewDown: getViewDown,
- getViewUp: getViewUp,
- getLastMonthDay: getLastMonthDay,
- getLastMonthDate: getLastMonthDate,
- getFirstMonthDate: getFirstMonthDate,
- getFirstWeekDate: getFirstWeekDate,
- normalizeDateByWeek: normalizeDateByWeek,
- getQuarter: getQuarter,
- getFirstQuarterMonth: getFirstQuarterMonth,
- dateInRange: dateInRange,
- roundToHour: roundToHour,
- normalizeDate: normalizeDate,
- getViewMinBoundaryDate: getViewMinBoundaryDate,
- getViewMaxBoundaryDate: getViewMaxBoundaryDate,
- fixTimezoneGap: fixTimezoneGap,
- getTimezonesDifference: getTimezonesDifference,
- makeDate: makeDate,
- getDatesInterval: getDatesInterval,
- getDatesOfInterval: getDatesOfInterval
- };
- module.exports = dateUtils;
|