11import type { Tagged } from 'type-fest' ;
22import type { Maybe , Optional } from './types.js' ;
33
4+ /**
5+ * Represents a valid Date object.
6+ * This type is used to ensure that the date is a valid instance of Date and not an invalid date.
7+ */
48export type ValidDate = Tagged < Date , 'valid' > ;
59
10+ /**
11+ * Checks if a value is a valid Date object.
12+ *
13+ * ```ts
14+ * isValidDate(new Date()); // true
15+ * isValidDate(new Date('2023-10-01')); // true
16+ * isValidDate(new Date('invalid-date')); // false
17+ * isValidDate('2023-10-01'); // false
18+ * ```
19+ */
620export function isValidDate ( date : Date ) : date is ValidDate {
721 return date instanceof Date && ! Number . isNaN ( date . getTime ( ) ) ;
822}
923
24+ /**
25+ * Gets the date string in ISO format (YYYY-MM-DD) from a Date object or a date-like value.
26+ *
27+ * ```ts
28+ * getDateString(new Date('2023-10-01')); // '2023-10-01'
29+ * getDateString('2023-10-01'); // '2023-10-01'
30+ * getDateString(1738358400000); // '2023-10-01'
31+ * getDateString(new Date('invalid-date')); // undefined
32+ * getDateString(null); // undefined
33+ * getDateString(undefined); // undefined
34+ * ```
35+ */
1036export function getDateString ( date : ValidDate ) : string ;
1137export function getDateString (
12- date ? : Maybe < Date | string | number > ,
38+ date : Maybe < Date | string | number > ,
1339) : Optional < string > ;
1440export function getDateString (
15- date ? : Maybe < Date | string | number > ,
41+ date : Maybe < Date | string | number > ,
1642) : Optional < string > {
1743 if ( date == null ) return undefined ;
1844
@@ -25,12 +51,24 @@ export function getDateString(
2551 return date . toISOString ( ) . split ( 'T' ) [ 0 ] ;
2652}
2753
54+ /**
55+ * Gets the date and time string in ISO format (YYYY-MM-DDTHH:mm:ss) from a Date object or a date-like value.
56+ *
57+ * ```ts
58+ * getDateTimeString(new Date('2023-10-01T12:34:56')); // '2023-10-01T12:34:56'
59+ * getDateTimeString('2023-10-01T12:34:56'); // '2023-10-01T12:34:56'
60+ * getDateTimeString(1738358400000); // '2023-10-01T00:00:00'
61+ * getDateTimeString(new Date('invalid-date')); // undefined
62+ * getDateTimeString(null); // undefined
63+ * getDateTimeString(undefined); // undefined
64+ * ```
65+ */
2866export function getDateTimeString ( date : ValidDate ) : string ;
2967export function getDateTimeString (
30- date ? : Maybe < Date | string | number > ,
68+ date : Maybe < Date | string | number > ,
3169) : Optional < string > ;
3270export function getDateTimeString (
33- date ? : Maybe < Date | string | number > ,
71+ date : Maybe < Date | string | number > ,
3472) : Optional < string > {
3573 if ( date == null ) return undefined ;
3674
@@ -43,12 +81,34 @@ export function getDateTimeString(
4381 return date . toISOString ( ) . split ( '.' ) [ 0 ] ;
4482}
4583
46- export function toDate ( value : Maybe < string | number | Date > ) {
84+ /**
85+ * Converts a value to a Date object.
86+ *
87+ * ```ts
88+ * toDate('2023-10-01'); // Date object for October 1, 2023
89+ * toDate(1738358400000); // Date object for October 1, 2023
90+ * toDate(new Date('2023-10-01')); // Date object for October 1, 2023
91+ * toDate('invalid-date'); // undefined
92+ * toDate(null); // undefined
93+ * toDate(undefined); // undefined
94+ * ```
95+ */
96+ export function toDate ( value : Maybe < string | number | Date > ) : Date | undefined {
4797 if ( value == null ) return undefined ;
4898 const date = new Date ( value ) ;
4999 return Number . isNaN ( date . getTime ( ) ) ? undefined : date ;
50100}
51101
102+ /**
103+ * Checks if a date is between two other dates (inclusive).
104+ *
105+ * ```ts
106+ * isBetween(new Date('2023-10-01'), new Date('2023-09-01'), new Date('2023-11-01')); // true
107+ * isBetween(new Date('2023-10-01'), new Date('2023-10-01'), new Date('2023-10-01')); // true
108+ * isBetween(new Date('2023-10-01'), new Date('2023-11-01'), new Date('2023-09-01')); // false
109+ * isBetween(new Date('2023-10-01'), new Date('2023-10-02'), new Date('2023-10-02')); // false
110+ * ```
111+ */
52112export function isBetween ( date : Date , min : Date , max : Date ) : boolean {
53113 return min <= date && date <= max ;
54114}
@@ -58,6 +118,18 @@ const defaultOptions: Intl.DateTimeFormatOptions = {
58118 timeStyle : 'short' ,
59119} ;
60120
121+ /**
122+ * Formats a date into a string using the specified locales and options.
123+ *
124+ * ```ts
125+ * formatDate(new Date('2023-10-01'), { locales: 'en-US', options: { dateStyle: 'full' } }); // "Sunday, October 1, 2023"
126+ * formatDate('2023-10-01', { locales: 'fr-FR', options: { dateStyle: 'long' } }); // "1 octobre 2023"
127+ * formatDate(1738358400000, { locales: 'de-DE', options: { timeStyle: 'short' } }); // "01.10.2023, 00:00"
128+ * formatDate(new Date('invalid-date')); // "Invalid Date"
129+ * formatDate(null); // undefined
130+ * formatDate(undefined); // undefined
131+ * ```
132+ */
61133export function formatDate (
62134 date : Maybe < string | number | Date > ,
63135 params ?: {
0 commit comments