new moment gtm change javascript timezone

moment - time zone javascript date



Cómo inicializar la fecha de javascript a una zona horaria particular (5)

Tengo el horario en una zona horaria particular como una cadena y quiero convertir esto a la hora local. Pero, no sé cómo configurar la zona horaria en el objeto Date.

Por ejemplo, tengo Feb 28 2013 7:00 PM ET, luego puedo

var mydate = new Date(); mydate.setFullYear(2013); mydate.setMonth(02); mydate.setDate(28); mydate.setHours(7); mydate.setMinutes(00);

Hasta donde yo sé, puedo establecer la hora UTC o la hora local. Pero, ¿cómo configuro la hora en otra zona horaria?

Traté de usar el agregar / restar el desplazamiento de UTC, pero no sé cómo contrarrestar los ahorros de luz diurna. No estoy seguro de si voy en la dirección correcta.

¿Cómo puedo convertir el tiempo de una zona horaria diferente a la hora local en javascript?


Fondo

El objeto Date de JavaScript realiza un seguimiento interno de la hora en UTC, pero generalmente acepta entradas y salidas en la hora local de la computadora en la que se está ejecutando. No tiene instalaciones para trabajar con el tiempo en otras zonas horarias. Puede analizar y generar fechas UTC o Local, pero no puede trabajar directamente con otras zonas horarias.

Para ser absolutamente preciso, la representación interna de un objeto Date es un número único, que representa la cantidad de milisegundos que han transcurrido desde 1970-01-01 00:00:00 UTC , independientemente de los segundos intercalares. No hay una zona horaria ni un formato de cadena almacenados en el objeto Date. Cuando se utilizan varias funciones del objeto Date , la zona horaria local de la computadora se aplica a la representación interna. Si la función produce una cadena, la información de la configuración regional de la computadora puede tomarse en consideración para determinar cómo producir esa cadena. Los detalles varían por función, y algunos son específicos de la implementación.

Bibliotecas

Afortunadamente, hay bibliotecas que pueden lograr esto. Implementan la base de datos de zona horaria estándar Olson / IANA en JavaScript. Algunos tienen gastos generales si se ejecuta en un navegador web, ya que la base de datos puede ser un poco grande si lo desea todo. Afortunadamente, muchas de estas bibliotecas le permiten seleccionar selectivamente qué zonas desea admitir, lo que hace que el tamaño de los datos sea mucho más aceptable. También algunos usan características modernas para obtener datos de zona horaria de la API Intl lugar de tener que enviarlos ellos mismos.

Hay varias bibliotecas para esto de las que soy consciente:

Luxon es probablemente la apuesta más segura para todo el uso moderno, y es el peso más ligero, ya que utiliza la API Intl para sus datos de zona horaria.

Moment-timezone es una extensión de moment.js , y trae sus propios datos de zona horaria.

js-joda es una implementación de JavaScript de Joda-Time API (desde Java) e incluye soporte de zona horaria a través de un módulo separado.

BigEasy / TimeZone también parece estar en el camino correcto.

WallTime-js ha llegado al final de la vida útil y los propietarios están migrando a la zona horaria de momento.

TimeZoneJS ha sido el más largo, pero se sabe que tiene algunos errores de larga data, especialmente cerca de las transiciones de horario de verano. Esperemos que estos se arreglen en algún momento en el futuro.

tz.js también ha existido por un tiempo, pero no está muy bien documentado, en mi humilde opinión.

Debe evaluar estas bibliotecas para ver cuál satisfará sus necesidades. Si no está seguro, vaya con momento / momento-zona horaria.

Soporte nativo en navegadores modernos

Si puede limitar su uso a los navegadores web modernos, ahora puede hacer lo siguiente sin ninguna biblioteca especial:

new Date().toLocaleString("en-US", {timeZone: "America/New_York"})

Esta no es una solución completa, pero funciona para muchos escenarios que solo requieren conversión de salida (desde UTC o hora local a una zona horaria específica, pero no en la otra dirección). Esto es parte de la API de internacionalización de ECMAScript (ECMA-402). Vea esta publicación para más detalles. Esta tabla de compatibilidad rastrea qué versiones son compatibles. Esta es la API Intl mencionada anteriormente que ciertas bibliotecas están usando internamente ahora.


Me encontré con un problema similar con las pruebas unitarias (específicamente en broma cuando las pruebas de la unidad se ejecutan localmente para crear las instantáneas y luego el servidor de CI se ejecuta (potencialmente) en una zona horaria diferente que hace que la comparación de instantáneas falle). Me burlé de nuestra Date y de algunos de los métodos de apoyo, así:

describe(''...'', () => { let originalDate; beforeEach(() => { originalDate = Date; Date = jest.fn( (d) => { let newD; if (d) { newD = (new originalDate(d)); } else { newD = (new originalDate(''2017-05-29T10:00:00z'')); } newD.toLocaleString = () => { return (new originalDate(newD.valueOf())).toLocaleString("en-US", {timeZone: "America/New_York"}); }; newD.toLocaleDateString = () => { return (new originalDate(newD.valueOf())).toLocaleDateString("en-US", {timeZone: "America/New_York"}); }; newD.toLocaleTimeString = () => { return (new originalDate(newD.valueOf())).toLocaleTimeString("en-US", {timeZone: "America/New_York"}); }; return newD; } ); Date.now = () => { return (Date()); }; }); afterEach(() => { Date = originalDate; }); });


Pruebe: date-from-timezone , resuelve la fecha esperada con la ayuda de Intl.DateTimeFormat disponible de forma nativa.

Utilicé ese método en uno de mis proyectos hace algunos años, pero ahora decidí publicarlo como un pequeño proyecto de sistema operativo :)


Puede especificar un desplazamiento de zona horaria en new Date() , por ejemplo:

new Date(''Feb 28 2013 19:00:00 EST'')

o

new Date(''Feb 28 2013 19:00:00 GMT-0500'')

Desde la hora UTC de la tienda de fechas (es decir, getTime regresa en UTC), javascript convertirá la hora en UTC, y cuando llame cosas como toString javascript convertirá la hora UTC en la zona horaria local del navegador y devolverá la cadena en la zona horaria local, es decir, si estoy usando UTC+8 :

> new Date(''Feb 28 2013 19:00:00 GMT-0500'').toString() < "Fri Mar 01 2013 08:00:00 GMT+0800 (CST)"

También puedes usar el getHours/Minute/Second normal getHours/Minute/Second :

> new Date(''Feb 28 2013 19:00:00 GMT-0500'').getHours() < 8

(Esto 8 significa que después de que el tiempo se convierta en mi hora local - UTC+8 , el número de horas es 8 ).


Sé que es 3 años demasiado tarde, pero tal vez pueda ayudar a otra persona, porque no he encontrado nada como eso excepto por la biblioteca de momento-huso horario, que no es exactamente lo mismo que lo que está preguntando aquí.

He hecho algo similar para la zona horaria alemana, esto es un poco complejo debido al horario de verano y los años bisiestos donde tienes 366 días.

podría necesitar un poco de trabajo con la función "isDaylightSavingTimeInGermany" mientras que diferentes zonas horarias cambian en diferentes momentos del horario de verano.

de todos modos, echa un vistazo a esta página: https://github.com/zerkotin/german-timezone-converter/wiki

los métodos principales son: convertLocalDateToGermanTimezone convertGermanDateToLocalTimezone

He dedicado un esfuerzo para documentarlo, por lo que no será tan confuso.