workspace-v1/shared/modules/utils/date.util.ts
rckrdmrd cb4c0681d3 feat(workspace): Add new projects and update architecture
New projects created:
- michangarrito (marketplace mobile)
- template-saas (SaaS template)
- clinica-dental (dental ERP)
- clinica-veterinaria (veterinary ERP)

Architecture updates:
- Move catalog from core/ to shared/
- Add MCP servers structure and templates
- Add git management scripts
- Update SUBREPOSITORIOS.md with 15 new repos
- Update .gitignore for new projects

Repository infrastructure:
- 4 main repositories
- 11 subrepositorios
- Gitea remotes configured

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-07 04:43:28 -06:00

249 lines
5.8 KiB
TypeScript

/**
* Date Utilities - Core Module
*
* Framework-agnostic date manipulation and formatting functions.
* Can be used in any project (NestJS, Express, Frontend, etc.)
*
* @module @shared/utils/date
* @version 1.0.0
*/
/**
* Format date to ISO string
*/
export const formatToISO = (date: Date): string => {
return date.toISOString();
};
/**
* Format date to readable string (YYYY-MM-DD)
*/
export const formatToDate = (date: Date): string => {
return date.toISOString().split('T')[0];
};
/**
* Format date to datetime string (YYYY-MM-DD HH:mm:ss)
*/
export const formatToDateTime = (date: Date): string => {
return date.toISOString().replace('T', ' ').split('.')[0];
};
/**
* Format date with custom pattern
* @param date - Date to format
* @param pattern - Pattern (YYYY, MM, DD, HH, mm, ss)
*/
export const formatDate = (date: Date, pattern: string): string => {
const pad = (n: number): string => n.toString().padStart(2, '0');
return pattern
.replace('YYYY', date.getFullYear().toString())
.replace('MM', pad(date.getMonth() + 1))
.replace('DD', pad(date.getDate()))
.replace('HH', pad(date.getHours()))
.replace('mm', pad(date.getMinutes()))
.replace('ss', pad(date.getSeconds()));
};
/**
* Add days to a date
*/
export const addDays = (date: Date, days: number): Date => {
const result = new Date(date);
result.setDate(result.getDate() + days);
return result;
};
/**
* Add hours to a date
*/
export const addHours = (date: Date, hours: number): Date => {
const result = new Date(date);
result.setHours(result.getHours() + hours);
return result;
};
/**
* Add minutes to a date
*/
export const addMinutes = (date: Date, minutes: number): Date => {
const result = new Date(date);
result.setMinutes(result.getMinutes() + minutes);
return result;
};
/**
* Add months to a date
*/
export const addMonths = (date: Date, months: number): Date => {
const result = new Date(date);
result.setMonth(result.getMonth() + months);
return result;
};
/**
* Check if date is in the past
*/
export const isPast = (date: Date): boolean => {
return date < new Date();
};
/**
* Check if date is in the future
*/
export const isFuture = (date: Date): boolean => {
return date > new Date();
};
/**
* Get start of day (00:00:00.000)
*/
export const startOfDay = (date: Date): Date => {
const result = new Date(date);
result.setHours(0, 0, 0, 0);
return result;
};
/**
* Get end of day (23:59:59.999)
*/
export const endOfDay = (date: Date): Date => {
const result = new Date(date);
result.setHours(23, 59, 59, 999);
return result;
};
/**
* Get start of month
*/
export const startOfMonth = (date: Date): Date => {
const result = new Date(date);
result.setDate(1);
result.setHours(0, 0, 0, 0);
return result;
};
/**
* Get end of month
*/
export const endOfMonth = (date: Date): Date => {
const result = new Date(date);
result.setMonth(result.getMonth() + 1, 0);
result.setHours(23, 59, 59, 999);
return result;
};
/**
* Get difference in days between two dates
*/
export const diffInDays = (date1: Date, date2: Date): number => {
const diff = Math.abs(date1.getTime() - date2.getTime());
return Math.ceil(diff / (1000 * 60 * 60 * 24));
};
/**
* Get difference in hours between two dates
*/
export const diffInHours = (date1: Date, date2: Date): number => {
const diff = Math.abs(date1.getTime() - date2.getTime());
return Math.ceil(diff / (1000 * 60 * 60));
};
/**
* Get difference in minutes between two dates
*/
export const diffInMinutes = (date1: Date, date2: Date): number => {
const diff = Math.abs(date1.getTime() - date2.getTime());
return Math.ceil(diff / (1000 * 60));
};
/**
* Check if two dates are the same day
*/
export const isSameDay = (date1: Date, date2: Date): boolean => {
return (
date1.getFullYear() === date2.getFullYear() &&
date1.getMonth() === date2.getMonth() &&
date1.getDate() === date2.getDate()
);
};
/**
* Parse ISO string to Date
*/
export const parseISO = (isoString: string): Date => {
return new Date(isoString);
};
/**
* Check if string is valid date
*/
export const isValidDate = (dateString: string): boolean => {
const date = new Date(dateString);
return !isNaN(date.getTime());
};
/**
* Get relative time description (e.g., "2 hours ago")
*/
export const getRelativeTime = (date: Date): string => {
const now = new Date();
const diffMs = now.getTime() - date.getTime();
const diffSec = Math.floor(diffMs / 1000);
const diffMin = Math.floor(diffSec / 60);
const diffHour = Math.floor(diffMin / 60);
const diffDay = Math.floor(diffHour / 24);
if (diffSec < 60) return 'just now';
if (diffMin < 60) return `${diffMin} minute${diffMin > 1 ? 's' : ''} ago`;
if (diffHour < 24) return `${diffHour} hour${diffHour > 1 ? 's' : ''} ago`;
if (diffDay < 30) return `${diffDay} day${diffDay > 1 ? 's' : ''} ago`;
return formatToDate(date);
};
/**
* Get Unix timestamp (seconds since epoch)
*/
export const toUnixTimestamp = (date: Date): number => {
return Math.floor(date.getTime() / 1000);
};
/**
* Create date from Unix timestamp
*/
export const fromUnixTimestamp = (timestamp: number): Date => {
return new Date(timestamp * 1000);
};
/**
* Check if date is today
*/
export const isToday = (date: Date): boolean => {
return isSameDay(date, new Date());
};
/**
* Check if date is yesterday
*/
export const isYesterday = (date: Date): boolean => {
const yesterday = addDays(new Date(), -1);
return isSameDay(date, yesterday);
};
/**
* Get age from birthdate
*/
export const getAge = (birthDate: Date): number => {
const today = new Date();
let age = today.getFullYear() - birthDate.getFullYear();
const monthDiff = today.getMonth() - birthDate.getMonth();
if (monthDiff < 0 || (monthDiff === 0 && today.getDate() < birthDate.getDate())) {
age--;
}
return age;
};