kanban / src /lib /utils.ts
Leon4gr45's picture
Deploy magic-resume as Docker Space (port 3000) (part 2)
aa1ee73 verified
Raw
History Blame Contribute Delete
2.14 kB
import { clsx, type ClassValue } from "clsx"
import { twMerge } from "tailwind-merge"
export function cn(...inputs: ClassValue[]) {
return twMerge(clsx(inputs))
}
const DATE_RANGE_SEPARATOR = " - ";
function parseToDate(dateStr: string): Date | null {
let year: number | null = null;
let month: number | null = null;
if (dateStr.match(/^\d{4}-\d{2}$/)) {
const parts = dateStr.split("-");
year = parseInt(parts[0], 10);
month = parseInt(parts[1], 10);
} else if (dateStr.match(/^\d{4}-\d{2}-\d{2}$/)) {
const parts = dateStr.split("-");
year = parseInt(parts[0], 10);
month = parseInt(parts[1], 10);
} else if (dateStr.match(/^\d{4}\.\d{2}$/)) {
const parts = dateStr.split(".");
year = parseInt(parts[0], 10);
month = parseInt(parts[1], 10);
} else if (dateStr.match(/^\d{4}\/\d{2}$/)) {
const parts = dateStr.split("/");
year = parseInt(parts[0], 10);
month = parseInt(parts[1], 10);
}
if (year !== null && month !== null) {
return new Date(Date.UTC(year, month - 1, 1));
}
return null;
}
export function formatDateString(dateStr: string | undefined, locale: string = "zh"): string {
if (!dateStr) return "";
if (dateStr.includes(DATE_RANGE_SEPARATOR)) {
const [start, end] = dateStr.split(DATE_RANGE_SEPARATOR);
return formatDateRange(start, end, locale);
}
const date = parseToDate(dateStr);
if (!date) return dateStr;
try {
if (locale === "zh" || locale === "zh-CN") {
return `${date.getUTCFullYear()}/${String(date.getUTCMonth() + 1).padStart(2, "0")}`;
}
const formatter = new Intl.DateTimeFormat(locale, {
year: 'numeric',
month: '2-digit',
timeZone: 'UTC'
});
return formatter.format(date);
} catch (e) {
return dateStr;
}
}
export function formatDateRange(
startDate: string | undefined,
endDate: string | undefined,
locale: string = "zh"
): string {
const start = formatDateString(startDate, locale).trim();
const end = formatDateString(endDate, locale).trim();
return [start, end].filter(Boolean).join(DATE_RANGE_SEPARATOR);
}