159 lines
4.5 KiB
TypeScript
159 lines
4.5 KiB
TypeScript
|
import { noteOnce } from '../../vc-util/warning';
|
||
|
import type { Moment } from 'moment';
|
||
|
import moment from 'moment';
|
||
|
import type { GenerateConfig } from '.';
|
||
|
|
||
|
const generateConfig: GenerateConfig<Moment> = {
|
||
|
// get
|
||
|
getNow: () => moment(),
|
||
|
getFixedDate: string => moment(string, 'YYYY-MM-DD'),
|
||
|
getEndDate: date => {
|
||
|
const clone = date.clone();
|
||
|
return clone.endOf('month');
|
||
|
},
|
||
|
getWeekDay: date => {
|
||
|
const clone = date.clone().locale('en_US');
|
||
|
return clone.weekday() + clone.localeData().firstDayOfWeek();
|
||
|
},
|
||
|
getYear: date => date.year(),
|
||
|
getMonth: date => date.month(),
|
||
|
getDate: date => date.date(),
|
||
|
getHour: date => date.hour(),
|
||
|
getMinute: date => date.minute(),
|
||
|
getSecond: date => date.second(),
|
||
|
|
||
|
// set
|
||
|
addYear: (date, diff) => {
|
||
|
const clone = date.clone();
|
||
|
return clone.add(diff, 'year');
|
||
|
},
|
||
|
addMonth: (date, diff) => {
|
||
|
const clone = date.clone();
|
||
|
return clone.add(diff, 'month');
|
||
|
},
|
||
|
addDate: (date, diff) => {
|
||
|
const clone = date.clone();
|
||
|
return clone.add(diff, 'day');
|
||
|
},
|
||
|
setYear: (date, year) => {
|
||
|
const clone = date.clone();
|
||
|
return clone.year(year);
|
||
|
},
|
||
|
setMonth: (date, month) => {
|
||
|
const clone = date.clone();
|
||
|
return clone.month(month);
|
||
|
},
|
||
|
setDate: (date, num) => {
|
||
|
const clone = date.clone();
|
||
|
return clone.date(num);
|
||
|
},
|
||
|
setHour: (date, hour) => {
|
||
|
const clone = date.clone();
|
||
|
return clone.hour(hour);
|
||
|
},
|
||
|
setMinute: (date, minute) => {
|
||
|
const clone = date.clone();
|
||
|
return clone.minute(minute);
|
||
|
},
|
||
|
setSecond: (date, second) => {
|
||
|
const clone = date.clone();
|
||
|
return clone.second(second);
|
||
|
},
|
||
|
|
||
|
// Compare
|
||
|
isAfter: (date1, date2) => date1.isAfter(date2),
|
||
|
isValidate: date => date.isValid(),
|
||
|
|
||
|
locale: {
|
||
|
getWeekFirstDay: locale => {
|
||
|
const date = moment().locale(locale);
|
||
|
return date.localeData().firstDayOfWeek();
|
||
|
},
|
||
|
getWeekFirstDate: (locale, date) => {
|
||
|
const clone = date.clone();
|
||
|
const result = clone.locale(locale);
|
||
|
return result.weekday(0);
|
||
|
},
|
||
|
getWeek: (locale, date) => {
|
||
|
const clone = date.clone();
|
||
|
const result = clone.locale(locale);
|
||
|
return result.week();
|
||
|
},
|
||
|
getShortWeekDays: locale => {
|
||
|
const date = moment().locale(locale);
|
||
|
return date.localeData().weekdaysMin();
|
||
|
},
|
||
|
getShortMonths: locale => {
|
||
|
const date = moment().locale(locale);
|
||
|
return date.localeData().monthsShort();
|
||
|
},
|
||
|
format: (locale, date, format) => {
|
||
|
const clone = date.clone();
|
||
|
const result = clone.locale(locale);
|
||
|
return result.format(format);
|
||
|
},
|
||
|
parse: (locale, text, formats) => {
|
||
|
const fallbackFormatList: string[] = [];
|
||
|
|
||
|
for (let i = 0; i < formats.length; i += 1) {
|
||
|
let format = formats[i];
|
||
|
let formatText = text;
|
||
|
|
||
|
if (format.includes('wo') || format.includes('Wo')) {
|
||
|
format = format.replace(/wo/g, 'w').replace(/Wo/g, 'W');
|
||
|
const matchFormat = format.match(/[-YyMmDdHhSsWwGg]+/g);
|
||
|
const matchText = formatText.match(/[-\d]+/g);
|
||
|
|
||
|
if (matchFormat && matchText) {
|
||
|
format = matchFormat.join('');
|
||
|
formatText = matchText.join('');
|
||
|
} else {
|
||
|
fallbackFormatList.push(format.replace(/o/g, ''));
|
||
|
}
|
||
|
}
|
||
|
|
||
|
const date = moment(formatText, format, locale, true);
|
||
|
if (date.isValid()) {
|
||
|
return date;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Fallback to fuzzy matching, this should always not reach match or need fire a issue
|
||
|
for (let i = 0; i < fallbackFormatList.length; i += 1) {
|
||
|
const date = moment(text, fallbackFormatList[i], locale, false);
|
||
|
|
||
|
/* istanbul ignore next */
|
||
|
if (date.isValid()) {
|
||
|
noteOnce(
|
||
|
false,
|
||
|
'Not match any format strictly and fallback to fuzzy match. Please help to fire a issue about this.',
|
||
|
);
|
||
|
return date;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return null;
|
||
|
},
|
||
|
},
|
||
|
toDate: (value, valueFormat) => {
|
||
|
if (Array.isArray(value)) {
|
||
|
return value.map((val: any) =>
|
||
|
typeof val === 'string' && val ? moment(val, valueFormat) : val || null,
|
||
|
) as Moment[];
|
||
|
} else {
|
||
|
return (
|
||
|
typeof value === 'string' && value ? moment(value, valueFormat) : value || null
|
||
|
) as Moment;
|
||
|
}
|
||
|
},
|
||
|
toString: (value, valueFormat) => {
|
||
|
if (Array.isArray(value)) {
|
||
|
return value.map((val: any) => (moment.isMoment(val) ? val.format(valueFormat) : val));
|
||
|
} else {
|
||
|
return moment.isMoment(value) ? value.format(valueFormat) : value;
|
||
|
}
|
||
|
},
|
||
|
};
|
||
|
|
||
|
export default generateConfig;
|