Tengo fecha con formato '2021-05-01T23:59:59.999-05:00'
Necesita obtener un valor de compensación utc como 300, 330, etc.
¿Alguien puede ayudar aquí? Se agradece cualquier respuesta sin usar moment.js.
Entonces extrayendo el valor -05:00 de '2021-05-01T23:59:59.999-05:00'
La función Date.getTimezoneOffset() solo le dará el desplazamiento entre la zona horaria de la máquina cliente y UTC, no le dará el desplazamiento UTC como se especifica en la cadena de fecha ISO.
Dado que las fechas están en formato ISO-8601 , podemos analizar el desplazamiento UTC de los datos, tendrá el formato ±[hh]:[mm], ±[hh][mm], ±[hh] o ' Z' para la hora UTC/Zulú.
Las compensaciones UTC negativas describen una zona horaria al oeste de UTC±00:00, donde la hora civil está atrasada (o antes) que UTC, por lo que el designador de zona se verá como "−03:00","−0300" o "−03 ".
Las compensaciones UTC positivas describen una zona horaria en o al este de UTC±00:00, donde la hora civil es igual o anterior (o posterior) a UTC, por lo que el indicador de zona se verá como "+02:00","+0200 ", o "+02".
Usaremos expresiones regulares para analizar las compensaciones de la zona horaria, esto también funcionará en IE 11.
function getUTCOffsetMinutes(isoDate) { // The pattern will be ±[hh]:[mm], ±[hh][mm], or ±[hh], or 'Z' const offsetPattern = /([+-]\d{2}|Z):?(\d{2})?\s*$/; if (!offsetPattern.test(isoDate)) { throw new Error("Cannot parse UTC offset.") } const result = offsetPattern.exec(isoDate); return (+result[1] || 0) * 60 + (+result[2] || 0); } const inputs = [ '2021-05-01T23:59:59.999+12:00', '2021-05-01T23:59:59.999+10', '2021-05-01T23:59:59.999+0530', '2021-05-01T23:59:59.999+0300', '2021-05-01T23:59:59.999Z', '2021-05-01T23:59:59.999-05:00', '2021-05-01T23:59:59.999-07:00', ]; for(var i = 0; i < inputs.length; i++) { console.log('input:', inputs[i], 'offsetMinutes:', getUTCOffsetMinutes(inputs[i])); }Más o menos lo mismo que @TerryLennox pero trata con:
function parseOffset(ts) { let [all,hr,min,sec] = (''+ts).match(/([+-]\d{2}|Z):?(\d{2})?:?(\d{2})?$/) || []; let sign = hr < 0 ? -1 : 1; return !all ? all : // No match, return undefined hr == 'Z' ? 0 : hr * 60 + (min? sign * min : 0) + (sec? sign * sec / 60 : 0); } ['2021-05-01T23:59:59.999-05:30', '2021-05-01T23:59:59.999+05:30', '2021-05-01T23:59:59.999-0530', '2021-05-01T23:59:59.999+0530', '2021-05-01T23:59:59.999-05', '2021-05-01T23:59:59.999+05', '2021-05-01T23:59:59.999+053012', '2021-05-01T23:59:59.999+05:30:12', '2021-05-01T23:59:59.999Z', '2021-05-01T23:59:59.999', 'blah' ].forEach(ts => console.log(ts + ' -> ' + parseOffset(ts)));