Tengo un formato de fecha personalizado así: new Date("02:56:12,80")
Empecé a analizar manualmente la hora, el minuto, el segundo y los milisegundos, pero es tedioso y tiene mucho código, probablemente propenso a errores. ¿Es posible tener un formato personalizado para que coincida con esta cadena para convertir a segundos?
Así es como estoy generando este formato para comenzar desde segundos:
const formatTimeFromSeconds = (seconds) => { dateObj = new Date(seconds * 1000); hours = dateObj.getUTCHours(); minutes = dateObj.getUTCMinutes(); seconds = dateObj.getSeconds(); milliseconds = dateObj.getMilliseconds(); timeString = hours.toString().padStart(2, "0") + ":" + minutes.toString().padStart(2, "0") + ":" + seconds.toString().padStart(2, "0") + "," + milliseconds.toString().padStart(2, "0"); return timeString; }; const dateToSeconds = (time) => { try { const times = time.split(":") const secondDelimit = times[2].split(".") const secondsConversion = parseInt(secondDelimit[0]) const hoursToSeconds = parseInt(times[0]) * 60 * 60 const minutesToSeconds = parseInt(times[1]) * 60 const totalSeconds = minutesToSeconds + hoursToSeconds + secondsConversion return `${totalSeconds}.${secondDelimit[1]}` } catch (err) { console.error(err) } }Puede trabajar desde el formato ISO (YYYY-mm-ddThh:mm:ss.sssZ) y usar una expresión regular para extraer la parte exacta, reemplazando el punto con una coma:
const formatTimeFromSeconds = (seconds) => { const date = new Date(seconds*1000); return date.toISOString().match(/^.*T(.*)\d{1}Z$/)[1].replace(".",","); }De esta manera, no tiene que extraer cada parte manualmente.
La expresión regular extrae en un grupo todo el texto entre la T y el último dígito antes de la Z. Se obtiene el grupo (índice 1 de la matriz resultante) y se realiza el reemplazo sobre él.
Puede agregar try/catch para cualquier error durante la conversión para hacer que la función sea más sólida frente a parámetros no válidos o agregar validaciones al argumento.
Instale Luxon: https://moment.github.io/luxon/#/?id=luxon
npm install luxonEntonces es una simple cuestión de...
const { DateTime } = require( 'luxon' ) ; const dt = DateTime.local( 2022, 6, 18, 22, 37, 9, 456 ) ; const formatted = dt.toFormat('HH:mm:ss,uu') ; // use 'hh' for 12-hour time console.log(`formatted: ${formatted}`) ;y obten
formatted: 22:37:09,45Si quieres rodar el tuyo...
dt = new Date(); console.log(`formatted: ${dt2time(dt)}`) function dt2time(dt) { const hh = str( dt.getHours() ); const mm = str( dt.getMinutes() ) ; const ss = str( dt.getSeconds() ) ; const tt = str( Math.round( dt.getMilliseconds() / 10 ) ) ; return `${hh}:${mm}:${ss},${tt}`; function str(n) { const s = String(n).padStart(2,'0'); return s; } }Pero usa Luxon. Es pequeño. Es compatible con la localización. Está limpio. Y el código que no escribe es código que no tiene que mantener.