La respuesta de Vadim puede obtener algunos puntos decimales después de la división por 60; no todas las compensaciones son múltiplos perfectos de 60 minutos. Esto es lo que estoy usando para valores de formato ISO 8601 cuerdas:
function pad(value) {
return value < 10 ? '0' + value : value;
}
function createOffset(date) {
var sign = (date.getTimezoneOffset() > 0) ? "-" : "+";
var offset = Math.abs(date.getTimezoneOffset());
var hours = pad(Math.floor(offset/60));
var minutes = pad(offset % 60);
return sign + hours + ":" + minutes;
}
Esto devuelve valores como "01: 30" o "-05: 00". Puede extraer los valores numéricos de mi ejemplo si es necesario para hacer cálculos.
Tenga en cuenta que getTimezoneOffset()
devuelve la diferencia de minutos de UTC, por lo que el valor parece ser opuesto (negado) de lo que se necesita para formatos como ISO 8601. De ahí que utilicé Math.abs()
(que también ayuda a no obtener resultados negativos minutos) y cómo construí el ternario.
http://www.electrictoolbox.com/javascript-get-timezone-offset/? – ken2k
Su código C# está roto para compensaciones que no son un múltiplo de una hora completa. – CodesInChaos