@@ -12,3 +12,64 @@ export function isPublishedDate(date: Date | string | undefined, now: Date = new
1212 const d = date instanceof Date ? date : new Date ( date ) ;
1313 return d <= now ;
1414}
15+
16+ /**
17+ * Convert a date value to a Date object
18+ */
19+ function toDate ( d : Date | string | undefined ) : Date | null {
20+ if ( ! d ) return null ;
21+ return d instanceof Date ? d : new Date ( d ) ;
22+ }
23+
24+ /**
25+ * Format a date for display
26+ * @param date - Date to format
27+ * @param short - If true, use short month names (Jan, Feb). Default true for lists.
28+ * @returns Formatted date string like "Jan 15, 2024" or "January 15, 2024"
29+ */
30+ export function formatDate ( date : Date | string | undefined , short : boolean = true ) : string {
31+ const d = toDate ( date ) ;
32+ if ( ! d || isNaN ( d . getTime ( ) ) ) return '' ;
33+ return d . toLocaleDateString ( 'en-US' , {
34+ year : 'numeric' ,
35+ month : short ? 'short' : 'long' ,
36+ day : 'numeric' ,
37+ } ) ;
38+ }
39+
40+ /**
41+ * Format a date range for events
42+ * @param start - Start date
43+ * @param end - End date (optional)
44+ * @param short - If true, use short month names. Default true for lists.
45+ * @returns Formatted date range like "Jan 15 - 17, 2024" or "Jan 15 - Feb 2, 2024"
46+ */
47+ export function formatDateRange (
48+ start : Date | string | undefined ,
49+ end ?: Date | string | undefined ,
50+ short : boolean = true
51+ ) : string {
52+ if ( ! start ) return '' ;
53+
54+ const startDate = toDate ( start ) ;
55+ const endDate = toDate ( end ) ;
56+
57+ if ( ! startDate || isNaN ( startDate . getTime ( ) ) ) return '' ;
58+
59+ // No end date or same as start
60+ if ( ! endDate || startDate . getTime ( ) === endDate . getTime ( ) ) {
61+ return formatDate ( startDate , short ) ;
62+ }
63+
64+ // Same month and year - show "Jan 15 - 17, 2024"
65+ if ( startDate . getMonth ( ) === endDate . getMonth ( ) && startDate . getFullYear ( ) === endDate . getFullYear ( ) ) {
66+ const monthDay = startDate . toLocaleDateString ( 'en-US' , {
67+ month : short ? 'short' : 'long' ,
68+ day : 'numeric' ,
69+ } ) ;
70+ return `${ monthDay } - ${ endDate . getDate ( ) } , ${ endDate . getFullYear ( ) } ` ;
71+ }
72+
73+ // Different months - show full dates
74+ return `${ formatDate ( startDate , short ) } - ${ formatDate ( endDate , short ) } ` ;
75+ }
0 commit comments