Tengo una cadena de duración ISO8601. ex. "PT1M14S" Quiero convertir esto a segundos (Int) usando el paquete date-fns en mecanografiado
Analizar una duración ISO es la mitad del problema, aplicar los valores a una fecha es la otra mitad. El siguiente es un analizador simple que devuelve un objeto en la forma {part: value} como:
{year: 1, month, 3, hour: 1, minute: 2}Solo devuelve propiedades para tokens que están en la cadena. Es necesario agregar alguna validación decente de la cadena.
function parseISODuration(s) { // QnD validation of string, need something smarter // Should check tokens, order and values // eg decimals only in smallest unit, W excludes other date parts if (!/^P/.test(s)) return; // Split into parts let parts = s.match(/\d+(\.\d+)?[az]|T/gi); // Flag for date and time parts, used to disambiguate month and minute let inDate = true; // Map of part tokens to words let partMap = {Y:'year',M:'month',W:'week',D:'day',h:'hour',m:'minute',s:'second'} return parts.reduce((acc, part) => { // Set flag if reached a time part if (part == 'T') { inDate = false; return acc; } // Disambiguate time parts (month/minute) if (!inDate) { part = part.toLowerCase(); } // Add part name and value as a number acc[partMap[part.slice(-1)]] = +part.slice(0,-1); return acc; }, {}); } // Examples ['P1Y2M1.5D', 'P1Y3M26DT3M', 'PT3H2M4.5S', 'P6W'].forEach(duration => console.log(`${duration} => ${JSON.stringify(parseISODuration(duration))}`) );Convertir una duración a milisegundos no es trivial y debe hacerse en el contexto de una fecha de inicio. Un enfoque es copiar la fecha de inicio, agregar los valores apropiados (una biblioteca ciertamente puede ayudar con eso), luego obtener la diferencia entre las fechas de inicio y finalización.
De esa manera, la instancia y la biblioteca de Date tienen en cuenta problemas como la duración de los meses y los días (donde se observa el horario de verano), pero hay muchas preguntas con buenas respuestas aquí sobre cómo agregar años, meses, días, etc. una fecha por lo que no es difícil escribir sus propias funciones para hacer eso.
El paquete proporciona una solución: iso8601-duration Así que podríamos hacer algo como
import { parse, toSeconds } from 'iso8601-duration'; toSeconds(parse("PT1M14S"))Por favor, hágamelo saber date-fns proporciona alguna solución para esto