Tengo una fecha y un formato para esa fecha, dado por el usuario. (dmyyyy y 15.10.2021 utilizados para este ejemplo)
A partir de ese formato, necesito obtener la posición del año, mes y día, para poder usar esa posición en la fecha.
const year = /y{4}|y{2}/.exec(format); const month = /m{1,2}/.exec(format); const day = /d{1,2}/.exec(format); const yearVal = date.substring(year.index, year.index + year[0].length); El problema con esto es que el formato tiene 1 letra, pero mi fecha tiene 2 números. (d y 15). Así que obtengo 0.20 en lugar de 2021 ¿Cómo puedo cambiar esto para que funcione con todos los formatos diferentes?
Puedes ver todos los formatos posibles aquí: node-dateformat
Por ejemplo: la diferencia entre "d" y "dd" es así:
"d" Día del mes como dígitos; sin cero inicial para días de un solo dígito.
"dd" Día del mes como dígitos; cero inicial para días de un solo dígito.
Podría generar una expresión regular a partir del patrón como este:
format.replace(/([ymd])\1*/g, (match, ymd) => `(?<${ymd}>${'\\d'.repeat(match.length)})`); yyyy-mm-dd se convertirá en /(<?y>\d\d\d\d)-(<?m>\d\d)-(<?d>\d\d)/ , luego puede extraer el año/mes/día usando nombres de grupo:
function getDates(format, date) { const regex = new RegExp(format.replace(/(\w)\1+|(\w)/g, ({length}, w, s) => `(?<${w||s}>${s ? '\\d+' : '\\d'.repeat(length)})`)); const result = date.match(regex); if(result) { const { y: year, m: month, d: day } = result.groups; return { year, month, day }; } } console.log(getDates('yyyy-mm-dd', '2021-10-15')); console.log(getDates('dd/mm/yyyy', '15/10/2021')); console.log(getDates('mm-dd-yy', '10-15-21')); console.log('----'); console.log(getDates('yyyy-m-d', '2021-9-15')); console.log(getDates('yyyy-m-d', '2021-10-6'));Otra opción aquí para dividir el formato y el valor, busque a/m/d en el índice respectivo
const lookup = ( format, value ) => { const f = format.split(/(m+|d+|y+)/).filter(Boolean); const v = value.split(/(\D+)/).filter(Boolean); return [ v[f.findIndex(i => i.startsWith('y'))], v[f.findIndex(i => i.startsWith('m'))], v[f.findIndex(i => i.startsWith('d'))] ]; } console.log(lookup('dmyyyy', '10.5.2021')); console.log(lookup('dmyyyy', '10.12.2021')); console.log(lookup('dd.mm.yyyy', '10.05.2021'));