import { Result } from 'rich-domain';
interface IDateValueObject {
// Instance Methods
value(): Date;
// Validation
isBefore(date: DateValueObject | Date): boolean;
isAfter(date: DateValueObject | Date): boolean;
isGreaterThan(date: DateValueObject | Date): boolean;
isLessThan(date: DateValueObject | Date): boolean;
isEqual(date: DateValueObject | Date): boolean;
// Date Arithmetic - Days
addDays(days: number): DateValueObject;
subtractDays(days: number): DateValueObject;
differenceInDays(date: DateValueObject | Date): number;
// Date Arithmetic - Months and Years
addMonths(months: number): DateValueObject;
addYears(years: number): DateValueObject;
// Time Arithmetic - Hours
addHours(hours: number): DateValueObject;
subtractHours(hours: number): DateValueObject;
differenceInHours(date: DateValueObject | Date): number;
// Time Arithmetic - Minutes
addMinutes(minutes: number): DateValueObject;
subtractMinutes(minutes: number): DateValueObject;
differenceInMinutes(date: DateValueObject | Date): number;
// Time Arithmetic - Seconds
addSeconds(seconds: number): DateValueObject;
subtractSeconds(seconds: number): DateValueObject;
differenceInSeconds(date: DateValueObject | Date): number;
// Formatting
format(locale?: string, options?: Intl.DateTimeFormatOptions): string;
toISOString(): string;
// Start and End of Day
startOfDay(): DateValueObject;
endOfDay(): DateValueObject;
// Day Checks
isWeekend(): boolean;
isWeekday(): boolean;
// Age Calculation
getAge(): number;
// Static Methods
/**
* Validates if the provided value is a valid date.
* @param value The date to validate.
* @returns A boolean indicating whether the date is valid.
*/
isValid(value: Date): boolean;
/**
* Creates a new DateValueObject representing the current date and time.
* @returns A new DateValueObject instance.
*/
now(): DateValueObject;
/**
* Initializes a DateValueObject with the provided value.
* @param value The date to initialize.
* @returns A new DateValueObject instance.
* @throws {Error} If the provided date is invalid.
*/
init(value: Date): DateValueObject;
/**
* Creates a Result object containing a DateValueObject initialized with the provided value.
* @param value The date to initialize.
* @returns A Result object containing either a DateValueObject or an error message.
*/
create(value: Date): Result<DateValueObject>;
}
Implement a DateValueObject:
Originally posted by @4lessandrodev in https://github.com/4lessandrodev/type-ddd/issues/446#issuecomment-2371948992