Saltar al contenido

¿Cómo calculo la diferencia de 2 zonas horarias en JavaScript?

Contamos con la mejor solución que encontramos en todo internet. Esperamos que te sea de mucha utilidad y si deseas comentarnos alguna mejora hazlo libremente.

Solución:

es imposible calcular los diferencia entre dos zonas horarias arbitrarias. Solo puedes calcular una diferencia. para un momento específico en el tiempo.

  • Es actualmente 4 horas de diferencia entre Londres y Nueva York (escribiendo esto el 25 de marzo de 2015).
  • Pero fue una diferencia de 5 horas hace unas semanas, y será de 5 dentro de unas semanas.
  • Cada zona horaria cambia las compensaciones para el horario de verano en un punto diferente en el tiempo.

Esto es true en el caso general entre dos zonas horarias. Sin embargo algunos las zonas horarias cambian exactamente a la misma hora o no cambian en absoluto.

  • Hay siempre una hora entre Londres y París, porque cambian en el mismo momento.
  • Hay siempre 3 horas entre Arizona y Hawái, porque tampoco tienen horario de verano.

Tenga en cuenta que en los Estados Unidos, cada zona horaria que usa DST en realidad cambia en un momento diferente en el tiempo. Todos ellos cambian a las 2:00 AM en su local tiempo, pero no al mismo tiempo universal momento en el tiempo.

  • Así que entre Chicago y Nueva York, hay generalmente 1 hora de diferencia
  • Pero durante dos breves períodos cada año están separados por 2 horas o tienen la misma hora exacta.

Consulte también “Zona horaria! = Desplazamiento” en la wiki de etiquetas de zona horaria.

Ahora, con respecto a la zona horaria del momento, dijiste en los comentarios:

El servidor web está en la zona horaria del Este; estamos en el centro. Necesito la diferencia en la zona horaria del usuario y el servidor.

La zona horaria del servidor web es irrelevante. Debería poder hospedar desde cualquier parte del mundo sin afectar su aplicación. Si no puedes, lo estás haciendo mal.

lata consigue el Actual diferencia horaria entre tu zona horaria (hora central de EE. UU.) y la del usuario. Ni siquiera necesita saber la zona horaria exacta del usuario para esto, si el código se ejecuta en el navegador:

var now = moment();
var localOffset = now.utcOffset();
now.tz("America/Chicago"); // your time zone, not necessarily the server's
var centralOffset = now.utcOffset();
var diffInMinutes = localOffset - centralOffset;

Si, en cambio, el código se estaba ejecutando en el servidor (en una aplicación node.js), entonces haría necesita saber la zona horaria del usuario. Simplemente cambie la primera línea de esta manera:

var now = moment.tz("America/New_York"); // their time zone

Respuesta actualizada:

Esto puede hacerse sin Momento, en entornos que admitan la API de internacionalización de ECMAScript y que tengan completamente implementada la compatibilidad con la zona horaria de IANA. Esta es la mayoría de los navegadores en estos días.

function getTimeZoneOffset(date, timeZone) 

  // Abuse the Intl API to get a local ISO 8601 string for a given time zone.
  let iso = date.toLocaleString('en-CA',  timeZone, hour12: false ).replace(', ', 'T');

  // Include the milliseconds from the original timestamp
  iso += '.' + date.getMilliseconds().toString().padStart(3, '0');

  // Lie to the Date object constructor that it's a UTC time.
  const lie = new Date(iso + 'Z');

  // Return the difference in timestamps, as minutes
  // Positive values are West of GMT, opposite of ISO 8601
  // this matches the output of `Date.getTimeZoneOffset`
  return -(lie - date) / 60 / 1000;

Ejemplo de uso:

getTimeZoneOffset(new Date(2020, 3, 13), 'America/New_York') //=> 240
getTimeZoneOffset(new Date(2020, 3, 13), 'Asia/Shanghai') //=> -480

Si desea la diferencia entre ellos, simplemente puede restar los resultados.

Nodo.js

La función anterior funciona en Node.js donde el full-icu el soporte de internacionalización está instalado (que es el valor predeterminado para Node 13 y posteriores). Si tiene una versión anterior con cualquiera system-icu o small-icu, puede utilizar esta función modificada. Funcionará en navegadores y full-icu ambientes también, pero es un poco más grande. (He probado esto en Node 8.17.0 en Linux y Node 12.13.1 en Windows).

function getTimeZoneOffset(date, timeZone) 

  // Abuse the Intl API to get a local ISO 8601 string for a given time zone.
  const options = timeZone, calendar: 'iso8601', year: 'numeric', month: '2-digit', day: '2-digit', hour: '2-digit', minute: '2-digit', second: '2-digit', hour12: false;
  const dateTimeFormat = new Intl.DateTimeFormat(undefined, options);
  const parts = dateTimeFormat.formatToParts(date);
  const map = new Map(parts.map(x => [x.type, x.value]));
  const year = map.get('year');
  const month = map.get('month');
  const day = map.get('day');
  const hour = map.get('hour');
  const minute = map.get('minute');
  const second = map.get('second');
  const ms = date.getMilliseconds().toString().padStart(3, '0');
  const iso = `$year-$month-$dayT$hour:$minute:$second.$ms`;

  // Lie to the Date object constructor that it's a UTC time.
  const lie = new Date(iso + 'Z');

  // Return the difference in timestamps, as minutes
  // Positive values are West of GMT, opposite of ISO 8601
  // this matches the output of `Date.getTimeZoneOffset`
  return -(lie - date) / 60 / 1000;

Tenga en cuenta que de cualquier manera, nosotros deber atravesar Intl para que la zona horaria se aplique correctamente.

Sección de Reseñas y Valoraciones

Ten en cuenta dar recomendación a esta noticia si te ayudó.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *