Debo agregar una validación para el vencimiento de la tarjeta donde debo mostrar un mensaje de error si la tarjeta está a punto de vencer dentro de los 3 meses a partir de la fecha actual
ex:
(month/year)1221 input --> false (invalid) 1121 input --> false (invalid) 122 input --> false (invalid) 221 input --> true (valid) 222 input --> true (valid)Desde el backend, este es el valor que obtengo valor = 424 --> 4 es el mes y 24 es el año que es válido y si desde el backend obtengo 1121 ---> 11 es el mes y 21 es el año que es inválido
¿Cómo validar si la fecha 1121 está dentro de los 3 meses?
A continuación se muestra la solución que estoy usando, pero no encuentro otras soluciones.
const d = new Date(); let today = d.getDate(); expValue = 424; const originalValue = expValue.toString().split(/(?=(?:.{2})+$)/g); if ( originalValue[0] >= today.month.toString() + 3 || originalValue[1] === today.year.toString() ) { return this.sanitizer.bypassSecurityTrustHtml( '<span class="text-danger">' + ('0' + originalValue[0]).slice(-2) + '/' + originalValue[1] + '</span>' ); } else { return this.sanitizer.bypassSecurityTrustHtml( ('0' + originalValue[0]).slice(-2) + '/' + originalValue[1] ); } }Usando las entradas originales que diste, puedes hacer algo como esto:
let inputs = ['12/21', '11/21', '01/22', '02/21', '12/22']; const parseDate =(e)=>{ return new Date(e.replace('/', '/1/')); }; const getDiff = (e)=>{ let curr = new Date(); let dt = parseDate(e); return (dt.getMonth() - curr.getMonth() + (12 * (dt.getYear() - curr.getYear()))) > 3; } inputs.forEach(el=>console.log(`${el} >> ${getDiff(el)}`));Si sus entradas están en un formato diferente o si tiene que tener en cuenta las cadenas que no siempre tienen la misma longitud, es posible que deba ajustar la función parseDate. Si está trabajando con una cadena de longitud variable sin el "/" incluido, entonces puede intentar algo como esto, usando las nuevas entradas que proporcionó:
let inputs = ['1221', '1121', '122', '221', '222']; const parseDate =(e)=>{ if(e.length==3) { e = '0'+e; } return new Date(`${e.substring(0,2)}/1/${e.slice(-2)}`); }; const getDiff = (e)=>{ let curr = new Date(); let dt = parseDate(e); return (dt.getMonth() - curr.getMonth() + (12 * (dt.getYear() - curr.getYear()))) > 3; } inputs.forEach(el=>console.log(`${el} >> ${getDiff(el)}`));Modifico la función parseDate para rellenar la cadena si la longitud es 3 (creo que siempre será 3 o 4), luego creo una fecha a partir de los dos primeros caracteres y los dos últimos caracteres, luego devuelvo eso, y todo lo demás es lo mismo.
Creo que la mejor manera de hacerlo es traducir las fechas en unidades que se adapten al problema. JS date getYear() da meses desde 1990, y esa es una unidad común prácticamente útil.
Ponga la fecha de la cadena de entrada y la fecha actual en unidades de meses desde 1990, luego compare...
const monthsSince1900 = string => { let chars = string.split(''); let month = +chars.slice(0, -2).join(''); let year = +chars.slice(-2).join(''); return 12 * (100 + year) + month }; const currentMonthsSince1990 = () => { let d = new Date(); return 12 * d.getYear() + d.getMonth() + 1; } const isExpiryValid = string => { let now = currentMonthsSince1990() let exp = monthsSince1900(string); return exp > now + 3 } console.log(isExpiryValid('1121')); // 11/21 will expire soon console.log(isExpiryValid('1221')); // 12/21 will expire soon console.log(isExpiryValid('122')); // 1/22 will expire soon console.log(isExpiryValid('222')); // 2/22 is good console.log(isExpiryValid('322')); // 3/22 is good