without now nodejs moment gettimezoneoffset ejemplos javascript timezone

now - ¿Cómo se formatea ISO 8601 una fecha con compensación de zona horaria en JavaScript?



moment-timezone npm (3)

Esta es mi función para la zona horaria de los clientes, su peso ligero y simple

function getCurrentDateTimeMySql() { var tzoffset = (new Date()).getTimezoneOffset() * 60000; //offset in milliseconds var localISOTime = (new Date(Date.now() - tzoffset)).toISOString().slice(0, 19).replace(''T'', '' ''); var mySqlDT = localISOTime; return mySqlDT; }

Objetivo: encontrar la local time y la UTC time offset y luego construir la URL en el siguiente formato.

URL de ejemplo: / Actions / Sleep? Duration = 2002-10-10T12: 00: 00-05: 00

El formato se basa en la recomendación W3C: http://www.w3.org/TR/xmlschema11-2/#dateTime

La documentación dice:

For example, 2002-10-10T12:00:00−05:00 (noon on 10 October 2002, Central Daylight Savings Time as well as Eastern Standard Time in the U.S.) is equal to 2002-10-10T17:00:00Z, five hours later than 2002-10-10T12:00:00Z.

Por lo tanto, según mi comprensión, necesito encontrar mi hora local por fecha nueva () y luego usar la función getTimezoneOffset () para calcular la diferencia y luego adjuntarla al final de la cadena.

1. Obtener hora local con formato

var local = new Date().format("yyyy-MM-ddThh:mm:ss"); //today (local time)

salida

2013-07-02T09:00:00

2. Obtenga el tiempo UTC desplazado por hora

var offset = local.getTimezoneOffset() / 60;

salida

7

3.Construir URL (parte de tiempo solamente)

var duration = local + "-" + offset + ":00";

salida:

2013-07-02T09:00:00-7:00

El resultado anterior significa que mi hora local es 2013/07/02 a las 9 a.m. y la diferencia con el UTC es de 7 horas (el horario UTC es 7 horas antes de la hora local)

Hasta ahora, parece funcionar, pero ¿y si getTimezoneOffset () devuelve un valor negativo como -120?

Me pregunto cómo debería verse el formato en tal caso porque no puedo deducirlo del documento W3C. Gracias por adelantado.


Lo siguiente debe funcionar correctamente, y para todos los navegadores (gracias a @MattJohnson por la sugerencia)

Date.prototype.toIsoString = function() { var tzo = -this.getTimezoneOffset(), dif = tzo >= 0 ? ''+'' : ''-'', pad = function(num) { var norm = Math.floor(Math.abs(num)); return (norm < 10 ? ''0'' : '''') + norm; }; return this.getFullYear() + ''-'' + pad(this.getMonth() + 1) + ''-'' + pad(this.getDate()) + ''T'' + pad(this.getHours()) + '':'' + pad(this.getMinutes()) + '':'' + pad(this.getSeconds()) + dif + pad(tzo / 60) + '':'' + pad(tzo % 60); } var dt = new Date(); console.log(dt.toIsoString());


getTimezoneOffset() devuelve el signo opuesto del formato requerido por la especificación a la que hizo referencia.

Este formato también se conoce como ISO8601 , o más precisamente como RFC3339 .

En este formato, UTC se representa con una Z mientras que todos los demás formatos están representados por una compensación de UTC. El significado es el mismo que el de JavaScript, pero el orden de resta se invierte, por lo que el resultado lleva el signo opuesto.

Además, no hay ningún método en el format objeto de Date nativo llamado, por lo que su función en el n. ° 1 fallará a menos que esté utilizando una biblioteca para lograr esto. Consulte esta documentación .

Si busca una biblioteca que pueda trabajar con este formato directamente, le recomiendo probar moment.js . De hecho, este es el formato predeterminado, por lo que simplemente puede hacer esto:

var m = moment(); // get "now" as a moment var s = m.format(); // the ISO format is the default so no parameters are needed // sample output: 2013-07-01T17:55:13-07:00

Esta es una solución bien probada entre navegadores y tiene muchas otras funciones útiles.