1
+ // Definimos algunas interfaces útiles
2
+ interface DateFormats {
3
+ dayMonthYear : string ;
4
+ hourMinuteSecond : string ;
5
+ dayOfYear : number ;
6
+ dayOfWeek : string ;
7
+ monthName : string ;
8
+ longFormat : string ;
9
+ isoFormat : string ;
10
+ twelveHourFormat : string ;
11
+ unixTimestamp : number ;
12
+ quarterOfYear : number ;
13
+ }
14
+
15
+ // Definimos algunos tipos de utilidad
16
+ type MonthName = 'Enero' | 'Febrero' | 'Marzo' | 'Abril' | 'Mayo' | 'Junio' |
17
+ 'Julio' | 'Agosto' | 'Septiembre' | 'Octubre' | 'Noviembre' | 'Diciembre' ;
18
+ type DayOfWeek = 'Domingo' | 'Lunes' | 'Martes' | 'Miércoles' | 'Jueves' | 'Viernes' | 'Sábado' ;
19
+
20
+ // Creamos algunas constantes con tipos
21
+ const DAYS_OF_WEEK : DayOfWeek [ ] = [
22
+ 'Domingo' , 'Lunes' , 'Martes' , 'Miércoles' , 'Jueves' , 'Viernes' , 'Sábado'
23
+ ] ;
24
+
25
+ const MONTHS : MonthName [ ] = [
26
+ 'Enero' , 'Febrero' , 'Marzo' , 'Abril' , 'Mayo' , 'Junio' ,
27
+ 'Julio' , 'Agosto' , 'Septiembre' , 'Octubre' , 'Noviembre' , 'Diciembre'
28
+ ] ;
29
+
30
+ class DateCalculator {
31
+ private currentDate : Date ;
32
+ private birthDate : Date ;
33
+
34
+ constructor ( birthDate : Date ) {
35
+ this . currentDate = new Date ( ) ;
36
+ this . birthDate = birthDate ;
37
+ }
38
+
39
+ calculateYearsBetween ( ) : number {
40
+ let years = this . currentDate . getFullYear ( ) - this . birthDate . getFullYear ( ) ;
41
+ const currentMonth = this . currentDate . getMonth ( ) ;
42
+ const birthMonth = this . birthDate . getMonth ( ) ;
43
+
44
+ // Ajustamos si aún no hemos llegado al mes y día de nacimiento este año
45
+ if ( currentMonth < birthMonth ||
46
+ ( currentMonth === birthMonth &&
47
+ this . currentDate . getDate ( ) < this . birthDate . getDate ( ) ) ) {
48
+ years -- ;
49
+ }
50
+
51
+ return years ;
52
+ }
53
+
54
+ formatDates ( ) : DateFormats {
55
+ return {
56
+ dayMonthYear : this . formatDate ( this . birthDate , 'dd/MM/yyyy' ) ,
57
+ hourMinuteSecond : this . formatTime ( this . birthDate ) ,
58
+ dayOfYear : this . getDayOfYear ( this . birthDate ) ,
59
+ dayOfWeek : DAYS_OF_WEEK [ this . birthDate . getDay ( ) ] ,
60
+ monthName : MONTHS [ this . birthDate . getMonth ( ) ] ,
61
+ longFormat : this . getLongFormat ( this . birthDate ) ,
62
+ isoFormat : this . birthDate . toISOString ( ) ,
63
+ twelveHourFormat : this . get12HourFormat ( this . birthDate ) ,
64
+ unixTimestamp : Math . floor ( this . birthDate . getTime ( ) / 1000 ) ,
65
+ quarterOfYear : Math . floor ( this . birthDate . getMonth ( ) / 3 ) + 1
66
+ } ;
67
+ }
68
+
69
+ private formatDate ( date : Date , format : string ) : string {
70
+ const day = String ( date . getDate ( ) ) . padStart ( 2 , '0' ) ;
71
+ const month = String ( date . getMonth ( ) + 1 ) . padStart ( 2 , '0' ) ;
72
+ const year = date . getFullYear ( ) ;
73
+
74
+ return format
75
+ . replace ( 'dd' , day )
76
+ . replace ( 'MM' , month )
77
+ . replace ( 'yyyy' , String ( year ) ) ;
78
+ }
79
+
80
+ private formatTime ( date : Date ) : string {
81
+ return date . toLocaleTimeString ( 'es-ES' , {
82
+ hour12 : false ,
83
+ hour : '2-digit' ,
84
+ minute : '2-digit' ,
85
+ second : '2-digit'
86
+ } ) ;
87
+ }
88
+
89
+ private getDayOfYear ( date : Date ) : number {
90
+ const startOfYear = new Date ( date . getFullYear ( ) , 0 , 0 ) ;
91
+ const diff = date . getTime ( ) - startOfYear . getTime ( ) ;
92
+ const oneDay = 1000 * 60 * 60 * 24 ;
93
+ return Math . floor ( diff / oneDay ) ;
94
+ }
95
+
96
+ private getLongFormat ( date : Date ) : string {
97
+ const dayOfWeek = DAYS_OF_WEEK [ date . getDay ( ) ] ;
98
+ const dayOfMonth = date . getDate ( ) ;
99
+ const month = MONTHS [ date . getMonth ( ) ] ;
100
+ const year = date . getFullYear ( ) ;
101
+
102
+ return `${ dayOfWeek } , ${ dayOfMonth } de ${ month } de ${ year } ` ;
103
+ }
104
+
105
+ private get12HourFormat ( date : Date ) : string {
106
+ return date . toLocaleTimeString ( 'es-ES' , { hour12 : true } ) ;
107
+ }
108
+ }
109
+
110
+ // Uso del código
111
+ const birthDate = new Date ( 1990 , 4 , 15 , 14 , 30 , 0 ) ; // Mes 4 es Mayo (0-11)
112
+ const calculator = new DateCalculator ( birthDate ) ;
113
+
114
+ // PARTE 1: Calcular años transcurridos
115
+ const yearsPassedTesting = ( ) : void => {
116
+ console . log ( 'Fecha actual:' , new Date ( ) . toLocaleString ( ) ) ;
117
+ console . log ( 'Fecha de nacimiento:' , birthDate . toLocaleString ( ) ) ;
118
+ console . log ( 'Años transcurridos:' , calculator . calculateYearsBetween ( ) ) ;
119
+ } ;
120
+
121
+ // PARTE 2: Mostrar diferentes formatos de fecha
122
+ const showFormattedDates = ( ) : void => {
123
+ const formats = calculator . formatDates ( ) ;
124
+
125
+ console . log ( '\nDIFERENTES FORMATOS DE FECHA:' ) ;
126
+ console . log ( '1. Día, mes y año:' , formats . dayMonthYear ) ;
127
+ console . log ( '2. Hora, minuto y segundo:' , formats . hourMinuteSecond ) ;
128
+ console . log ( '3. Día del año:' , formats . dayOfYear ) ;
129
+ console . log ( '4. Día de la semana:' , formats . dayOfWeek ) ;
130
+ console . log ( '5. Nombre del mes:' , formats . monthName ) ;
131
+ console . log ( '6. Formato largo:' , formats . longFormat ) ;
132
+ console . log ( '7. Formato ISO:' , formats . isoFormat ) ;
133
+ console . log ( '8. Formato 12 horas:' , formats . twelveHourFormat ) ;
134
+ console . log ( '9. Unix Timestamp:' , formats . unixTimestamp ) ;
135
+ console . log ( '10. Trimestre del año:' , formats . quarterOfYear ) ;
136
+ } ;
137
+
138
+ // Ejecutamos las funciones
139
+ yearsPassedTesting ( ) ;
140
+ showFormattedDates ( ) ;
0 commit comments