Files
2026-06-04 18:13:23 +07:00

113 lines
3.8 KiB
JavaScript

export class DateRangeCalculator {
static clearTime(date) {
if (!date) return null;
const d = new Date(date);
d.setHours(0, 0, 0, 0);
return d;
}
static datesEqual(left, right) {
if (!left || !right) return false;
return left.getFullYear() === right.getFullYear()
&& left.getMonth() === right.getMonth()
&& left.getDate() === right.getDate();
}
static calculatePreset(presetName, todayInput = new Date()) {
const today = this.clearTime(todayInput);
let start = null;
let end = null;
switch (presetName) {
case 'today':
start = new Date(today);
end = new Date(today);
break;
case 'yesterday':
start = new Date(today);
start.setDate(today.getDate() - 1);
end = new Date(start);
break;
case 'last7':
end = new Date(today);
start = new Date(today);
start.setDate(today.getDate() - 6);
break;
case 'last14':
end = new Date(today);
start = new Date(today);
start.setDate(today.getDate() - 13);
break;
case 'last30':
end = new Date(today);
start = new Date(today);
start.setDate(today.getDate() - 29);
break;
case 'thisWeek': {
end = new Date(today);
start = new Date(today);
const day = today.getDay();
const diff = today.getDate() - day + (day === 0 ? -6 : 1);
start.setDate(diff);
break;
}
case 'lastWeek': {
const temp = new Date(today);
const day = temp.getDay();
const diff = temp.getDate() - day + (day === 0 ? -6 : 1);
start = new Date(temp);
start.setDate(diff - 7);
end = new Date(temp);
end.setDate(diff - 1);
break;
}
case 'thisMonth':
start = new Date(today.getFullYear(), today.getMonth(), 1);
end = new Date(today);
break;
case 'lastMonth':
start = new Date(today.getFullYear(), today.getMonth() - 1, 1);
end = new Date(today.getFullYear(), today.getMonth(), 0);
break;
case 'all':
default:
start = null;
end = null;
break;
}
return { start, end };
}
static formatDisplay(date) {
if (!date) return '';
const d = new Date(date);
const day = String(d.getDate()).padStart(2, '0');
const month = String(d.getMonth() + 1).padStart(2, '0');
return `${day}/${month}/${d.getFullYear()}`;
}
static parseDisplayDate(value) {
const match = String(value || '').trim().match(/^(\d{1,2})[\/\-.](\d{1,2})[\/\-.](\d{4})$/);
if (!match) return null;
const day = Number.parseInt(match[1], 10);
const month = Number.parseInt(match[2], 10) - 1;
const year = Number.parseInt(match[3], 10);
if (month < 0 || month > 11 || day < 1 || day > 31 || year < 1000 || year > 9999) return null;
const date = new Date(year, month, day);
if (date.getFullYear() !== year || date.getMonth() !== month || date.getDate() !== day) return null;
return date;
}
static toDateKey(date) {
if (!date) return '';
const d = new Date(date);
const year = d.getFullYear();
const month = String(d.getMonth() + 1).padStart(2, '0');
const day = String(d.getDate()).padStart(2, '0');
return `${year}-${month}-${day}`;
}
}