51 lines
1.5 KiB
TypeScript
51 lines
1.5 KiB
TypeScript
import { type ClassValue, clsx } from "clsx"
|
|
import { twMerge } from "tailwind-merge"
|
|
|
|
export function cn(...inputs: ClassValue[]) {
|
|
return twMerge(clsx(inputs))
|
|
}
|
|
|
|
/** Parse both `dd-MM-yyyy` and ISO 8601 date strings into a Date object. */
|
|
function parseDate(dateStr: string): Date {
|
|
// ISO 8601: starts with 4-digit year (e.g. "2026-04-05" or "2026-04-05T00:00:00.000Z")
|
|
if (/^\d{4}-/.test(dateStr)) return new Date(dateStr);
|
|
// Legacy dd-MM-yyyy (e.g. "05-04-2026")
|
|
const [day, month, year] = dateStr.split("-").map(Number);
|
|
return new Date(year, month - 1, day);
|
|
}
|
|
|
|
// "Thursday, April 5, 2026"
|
|
export function formatDate(dateStrOrDate: string | Date): string {
|
|
const date = dateStrOrDate instanceof Date ? dateStrOrDate : parseDate(dateStrOrDate);
|
|
|
|
const options: Intl.DateTimeFormatOptions = {
|
|
weekday: "long",
|
|
year: "numeric",
|
|
month: "long",
|
|
day: "numeric",
|
|
};
|
|
|
|
return date.toLocaleDateString("en-US", options);
|
|
}
|
|
|
|
// "Apr 5, 2026"
|
|
export function formatDate2(dateStrOrDate: string | Date): string {
|
|
const date = dateStrOrDate instanceof Date ? dateStrOrDate : parseDate(dateStrOrDate);
|
|
|
|
const options: Intl.DateTimeFormatOptions = {
|
|
month: "short",
|
|
day: "numeric",
|
|
year: "numeric",
|
|
};
|
|
return date.toLocaleDateString("en-US", options);
|
|
}
|
|
|
|
export function stringToDate(date: string | Date) {
|
|
return date instanceof Date ? date : parseDate(date);
|
|
}
|
|
|
|
export function toIsoDateOnly(dateStrOrDate: string | Date): string {
|
|
const date = stringToDate(dateStrOrDate)
|
|
return date.toISOString().slice(0, 10)
|
|
}
|