hrms-manual/node_modules/@vuepic/vue-datepicker/src/VueDatePicker/utils/date-utils.ts

135 lines
4 KiB
TypeScript
Raw Normal View History

2023-09-06 14:51:44 +07:00
import {
parse,
isDate,
isValid,
setHours,
setMinutes,
setSeconds,
setMilliseconds,
isBefore,
isEqual,
isAfter,
} from 'date-fns';
import type { DateTimeSetter, DateValue } from '@/interfaces';
const parseTextToDate = (value: string, pattern: string): Date | null => {
const parsedDate = parse(value, pattern.slice(0, value.length), new Date());
if (isValid(parsedDate) && isDate(parsedDate)) {
return parsedDate;
}
return null;
};
export const parseFreeInput = (
value: string,
pattern: string | string[] | ((value: string) => Date | null),
): Date | null => {
if (typeof pattern === 'string') {
return parseTextToDate(value, pattern);
}
if (Array.isArray(pattern)) {
let parsedDate = null;
for (const textVal of pattern) {
parsedDate = parseTextToDate(value, textVal);
if (parsedDate) {
break;
}
}
return parsedDate;
}
if (typeof pattern === 'function') {
return pattern(value);
}
return null;
};
export const getDate = (value?: Date | string | number) => (value ? new Date(value) : new Date());
export const dateToUtc = (date: Date, preserve: boolean) => {
if (preserve) {
const month = (date.getMonth() + 1).toString().padStart(2, '0');
const day = date.getDate().toString().padStart(2, '0');
const hours = date.getHours().toString().padStart(2, '0');
const minutes = date.getMinutes().toString().padStart(2, '0');
return `${date.getFullYear()}-${month}-${day}T${hours}:${minutes}:00.000Z`;
}
const utcDate = Date.UTC(
date.getUTCFullYear(),
date.getUTCMonth(),
date.getUTCDate(),
date.getUTCHours(),
date.getUTCMinutes(),
date.getUTCSeconds(),
);
return new Date(utcDate).toISOString();
};
// Reset date time
export const resetDateTime = (value: Date | string): Date => {
let dateParse = getDate(JSON.parse(JSON.stringify(value)));
dateParse = setHours(dateParse, 0);
dateParse = setMinutes(dateParse, 0);
dateParse = setSeconds(dateParse, 0);
dateParse = setMilliseconds(dateParse, 0);
return dateParse;
};
export const setDateTime = (
date: Date | null,
hours?: DateTimeSetter,
minutes?: DateTimeSetter,
seconds?: DateTimeSetter,
): Date => {
let dateCopy = date ? getDate(date) : getDate();
if (hours || hours === 0) {
dateCopy = setHours(dateCopy, +hours);
}
if (minutes || minutes === 0) {
dateCopy = setMinutes(dateCopy, +minutes);
}
if (seconds || seconds === 0) {
dateCopy = setSeconds(dateCopy, +seconds);
}
return setMilliseconds(dateCopy, 0);
};
export const isDateBefore = (date: DateValue, dateToCompare: DateValue): boolean => {
if (!date || !dateToCompare) {
return false;
}
return isBefore(resetDateTime(date), resetDateTime(dateToCompare));
};
export const isDateEqual = (date: DateValue, dateToCompare: DateValue): boolean => {
if (!date || !dateToCompare) {
return false;
}
return isEqual(resetDateTime(date), resetDateTime(dateToCompare));
};
export const isDateAfter = (date: DateValue, dateToCompare: DateValue): boolean => {
if (!date || !dateToCompare) {
return false;
}
return isAfter(resetDateTime(date), resetDateTime(dateToCompare));
};
export const isDateBetween = (range: Date[], hoverDate: Date | null, dateToCheck: Date): boolean => {
if (range && range[0] && range[1]) {
return isDateAfter(dateToCheck, range[0]) && isDateBefore(dateToCheck, range[1]);
}
if (range && range[0] && hoverDate) {
return (
(isDateAfter(dateToCheck, range[0]) && isDateBefore(dateToCheck, hoverDate)) ||
(isDateBefore(dateToCheck, range[0]) && isDateAfter(dateToCheck, hoverDate))
);
}
return false;
};