You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

214 lines
6.8 KiB

import XEUtils from 'xe-utils';
export function hasTimestampValueType(valueFormat) {
return valueFormat === 'timestamp';
}
export function hasDateValueType(valueFormat) {
return valueFormat === 'date';
}
export function handleValueFormat(type, valueFormat) {
if (valueFormat) {
if (!(hasDateValueType(valueFormat) || hasTimestampValueType(valueFormat))) {
return valueFormat;
}
}
if (type === 'time') {
return 'HH:mm:ss';
}
if (type === 'datetime') {
return 'yyyy-MM-dd HH:mm:ss';
}
return 'yyyy-MM-dd';
}
export function toStringTimeDate(str) {
const rest = new Date(2e3, 0, 1);
if (str) {
let h = 0;
let m = 0;
let s = 0;
if (XEUtils.isNumber(str) || /^[0-9]{11,15}$/.test(`${str}`)) {
str = new Date(Number(str));
}
if (XEUtils.isDate(str)) {
h = str.getHours();
m = str.getMinutes();
s = str.getSeconds();
}
else {
str = XEUtils.toValueString(str);
const parses = str.match(/^(\d{1,2})(:(\d{1,2}))?(:(\d{1,2}))?/);
if (parses) {
h = XEUtils.toNumber(parses[1]);
m = XEUtils.toNumber(parses[3]);
s = XEUtils.toNumber(parses[5]);
}
}
rest.setHours(h);
rest.setMinutes(m);
rest.setSeconds(s);
return rest;
}
return rest;
}
export function getDateQuarter(date) {
const month = date.getMonth();
if (month < 3) {
return 1;
}
else if (month < 6) {
return 2;
}
else if (month < 9) {
return 3;
}
return 4;
}
export const parseDateValue = (val, type, options) => {
const { valueFormat } = options;
if (val) {
if (type === 'time') {
return toStringTimeDate(val);
}
if (XEUtils.isNumber(val) || /^[0-9]{10,15}$/.test(`${val}`)) {
return new Date(Number(val));
}
if (XEUtils.isString(val)) {
return XEUtils.toStringDate(XEUtils.last(val.split(',')), valueFormat);
}
return XEUtils.toStringDate(val, valueFormat);
}
return null;
};
export const parseDateString = (val, type, options) => {
const dValue = parseDateValue(val, type, options);
return dValue ? XEUtils.toDateString(dValue, options.valueFormat) : '';
};
export function parseDateObj(val, type, options) {
const { labelFormat, firstDay } = options;
let dValue = null;
let dLabel = '';
if (val) {
dValue = parseDateValue(val, type, options);
}
if (XEUtils.isValidDate(dValue)) {
dLabel = XEUtils.toDateString(dValue, labelFormat, { firstDay });
// 周选择器,由于年份和第几周是冲突的行为,所以需要特殊处理,判断是否跨年,例如
// '2024-12-31' 'yyyy-MM-dd W' >> '2024-12-31 1'
// '2025-01-01' 'yyyy-MM-dd W' >> '2025-01-01 1'
if (labelFormat && type === 'week') {
const weekNum = XEUtils.getYearWeek(dValue, firstDay);
const weekDate = XEUtils.getWhatWeek(dValue, 0, weekNum === 1 ? ((6 + firstDay) % 7) : firstDay, firstDay);
const weekFullYear = weekDate.getFullYear();
if (weekFullYear !== dValue.getFullYear()) {
const yyIndex = labelFormat.indexOf('yyyy');
if (yyIndex > -1) {
const yyNum = Number(dLabel.substring(yyIndex, yyIndex + 4));
if (yyNum && !isNaN(yyNum)) {
dLabel = dLabel.replace(`${yyNum}`, `${weekFullYear}`);
}
}
}
}
}
else {
dValue = null;
}
return { label: dLabel, value: dValue };
}
export function getDateByCode(code, val, type, options) {
const { valueFormat, firstDay } = options;
let dValue = null;
const value = (code === 'prev' || code === 'next' ? new Date() : (val ? parseDateValue(val, type, options) : null)) || new Date();
switch (code) {
case 'prev':
case 'next':
case 'minus':
case 'plus': {
const offsetNum = code === 'plus' || code === 'next' ? 1 : -1;
switch (type) {
case 'date':
case 'datetime':
dValue = XEUtils.getWhatDay(value, offsetNum);
break;
case 'week':
dValue = XEUtils.getWhatWeek(value, offsetNum, firstDay, firstDay);
break;
case 'month':
dValue = XEUtils.getWhatMonth(value, offsetNum);
break;
case 'quarter':
dValue = XEUtils.getWhatQuarter(value, offsetNum);
break;
case 'year':
dValue = XEUtils.getWhatYear(value, offsetNum);
break;
}
break;
}
default:
dValue = new Date();
break;
}
return {
value: dValue ? XEUtils.toDateString(dValue, valueFormat) : ''
};
}
const rangeDateOffsetNumMaps = {
last180: -180,
last90: -90,
last60: -60,
last30: -30,
last7: -7,
last3: -3,
last1: -1
};
function getRangeDateOffsetNum(code) {
return rangeDateOffsetNumMaps[code] || 0;
}
export function getRangeDateByCode(code, val, type, options) {
const { valueFormat, firstDay } = options;
if (XEUtils.isArray(val)) {
val = val.join('');
}
const value = (val ? parseDateValue(val, type, options) : null) || new Date();
let sValue = null;
const eValue = value;
switch (code) {
case 'last1':
case 'last3':
case 'last7':
case 'last30':
case 'last60':
case 'last90':
case 'last180': {
const offsetNum = getRangeDateOffsetNum(code);
switch (type) {
case 'date':
case 'datetime':
sValue = XEUtils.getWhatDay(value, offsetNum);
break;
case 'week':
sValue = XEUtils.getWhatWeek(value, offsetNum, firstDay, firstDay);
break;
case 'month':
sValue = XEUtils.getWhatMonth(value, offsetNum);
break;
case 'quarter':
sValue = XEUtils.getWhatQuarter(value, offsetNum);
break;
case 'year':
sValue = XEUtils.getWhatYear(value, offsetNum);
break;
}
break;
}
default:
sValue = new Date();
break;
}
const startValue = sValue ? XEUtils.toDateString(sValue, valueFormat) : '';
const endValue = eValue ? XEUtils.toDateString(eValue, valueFormat) : '';
return {
startValue,
endValue
};
}