Tengo una fecha y hora 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 Fecha.
Por ejemplo, tengo Feb 28 2013 7:00 PM ET,
entonces puedo
var mydate = new Date();
mydate.setFullYear(2013);
mydate.setMonth(02);
mydate.setDate(28);
mydate.setHours(7);
mydate.setMinutes(00);
Hasta donde sé, puedo configurar la hora UTC o la hora local. Pero, ¿cómo configuro la hora en otra zona horaria?
Traté de usar la suma / resta del desplazamiento de UTC pero no sé cómo contrarrestar el horario de verano. No estoy seguro si me dirijo en la dirección correcta.
¿Cómo puedo convertir la hora de una zona horaria diferente a la hora local en javascript?
javascript
timezone
pavimentado
fuente
fuente
Respuestas:
Antecedentes
El
Date
objeto de JavaScript rastrea el tiempo en UTC internamente, pero generalmente acepta entradas y produce salidas en la hora local de la computadora en la que se está ejecutando. Tiene muy pocas instalaciones para trabajar con el tiempo en otras zonas horarias.La representación interna de un
Date
objeto es un número único, que representa el número de milisegundos que han transcurrido desde entonces1970-01-01 00:00:00 UTC
, independientemente de los segundos bisiestos. No hay zona horaria o formato de cadena almacenado en el objeto Fecha en sí. CuandoDate
se utilizan varias funciones del objeto, la zona horaria local de la computadora se aplica a la representación interna. Si la función produce una cadena, entonces la información de la ubicación de la computadora puede tomarse en consideración para determinar cómo producir esa cadena. Los detalles varían según la función, y algunos son específicos de la implementación.Las únicas operaciones que el
Date
objeto puede hacer con zonas horarias no locales son:Puede analizar una cadena que contiene un desplazamiento numérico UTC de cualquier zona horaria. Utiliza esto para ajustar el valor que se analiza y almacena el equivalente UTC. La hora local original y el desplazamiento no se conservan en el
Date
objeto resultante . Por ejemplo:En entornos que han implementado la API de internacionalización ECMASCript (también conocida como "Intl"), un
Date
objeto puede producir una cadena específica de la localidad ajustada a un identificador de zona horaria dado. Esto se logra a través de latimeZone
opcióntoLocaleString
ay sus variaciones. La mayoría de las implementaciones admitirán identificadores de zona horaria de IANA, como'America/New_York'
. Por ejemplo:La mayoría de los entornos modernos admiten el conjunto completo de identificadores de zona horaria de IANA ( consulte la tabla de compatibilidad aquí ). Sin embargo, tenga en cuenta que el único identificador requiere ser apoyada por Intl es
'UTC'
, por lo tanto usted debe comprobar cuidadosamente si es necesario apoyar los navegadores antiguos o entornos atípicos (por ejemplo, dispositivos IO ligeros).Bibliotecas
Hay varias bibliotecas que se pueden usar para trabajar con zonas horarias. Aunque todavía no pueden hacer que el
Date
objeto se comporte de manera diferente, generalmente implementan la base de datos estándar de zonas horarias de la IANA y proporcionan funciones para usarlo en JavaScript. Las bibliotecas modernas usan los datos de zona horaria proporcionados por la API Intl, pero las bibliotecas más antiguas suelen tener gastos generales, especialmente si se ejecuta en un navegador web, ya que la base de datos puede ser un poco grande. Algunas de estas bibliotecas también le permiten reducir selectivamente el conjunto de datos, ya sea por qué zonas horarias son compatibles y / o por el rango de fechas con las que puede trabajar.Aquí están las bibliotecas a considerar:
Bibliotecas basadas en Intl
El nuevo desarrollo debe elegir una de estas implementaciones, que dependen de la API Intl para sus datos de zona horaria:
Bibliotecas no internacionales
Estas bibliotecas se mantienen, pero conllevan la carga de empaquetar sus propios datos de zona horaria, que pueden ser bastante grandes.
* Si bien Moment y Moment-Timezone se recomendaron anteriormente, el equipo de Moment ahora prefiere que los usuarios elijan Luxon para un nuevo desarrollo.
Bibliotecas descontinuadas
Estas bibliotecas se han descontinuado oficialmente y ya no se deben usar.
Propuestas Futuras
La propuesta temporal TC39 tiene como objetivo proporcionar un nuevo conjunto de objetos estándar para trabajar con fechas y horas en el lenguaje JavaScript. Esto incluirá soporte para un objeto con reconocimiento de zona horaria.
fuente
var date_time = new Date()
el valor dedate_time
es (para mí en AEST)Date {Sun Aug 21 2016 22:18:47 GMT+1000 (AEST)}
y, por lo tanto, parece que ha almacenado una zona horaria. ¿Cómo puedo asegurar quedate_time
es puramente la hora UTC, sin incluir ninguna zona horaria?new Date().getTime();
Como dijo Matt Johnson
Entonces, aunque el navegador no puede leer las zonas horarias de la IANA al crear una fecha, o tiene algún método para cambiar las zonas horarias en un objeto Date existente, parece que hay un truco a su alrededor:
fuente
toLocaleString
para lograr el efecto inverso, y sí, ¡esto debería ser de conocimiento común! ir a escribir un artículo sobre ello y me mencionar :-)Date
objeto que devuelve es una mentira. Incluso en el ejemplo que se muestra, la salida de cadena incluye la zona horaria de la máquina local. En mi computadora, ambos resultados dicen "GMT-0700 (hora de verano del Pacífico)", donde eso solo es correcto para el primero (Toronto está realmente en hora del este). Más allá de la salida de la cadena, la marca de tiempo contenida dentro delDate
objeto ha sido cambiado a un punto diferente en el tiempo. Esta puede ser una técnica útil, pero viene con muchas advertencias, principalmente que lasDate
funciones del objeto no tendrán una salida normal.Puede especificar un desplazamiento de zona horaria en
new Date()
, por ejemplo:o
Dado que
Date
almacena la hora UTC (es decir,getTime
regresa en UTC), javascript convertirá la hora en UTC, y cuando llame a cosas comotoString
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 usandoUTC+8
:También puedes usar el
getHours/Minute/Second
método normal :(Esto
8
significa que después de que la hora se convierta en mi hora localUTC+8
, el número de horas es8
).fuente
Esto debería resolver su problema, no dude en ofrecer soluciones. Este método también tendrá en cuenta el horario de verano para la fecha indicada.
Cómo usar con zona horaria y hora local:
fuente
tzDate
directamente?Encontré que la forma más compatible de hacer esto, sin preocuparme por una biblioteca de terceros, era usar
getTimezoneOffset
para calcular la marca de tiempo adecuada o actualizar la hora y luego usar los métodos normales para obtener la fecha y hora necesarias.EDITAR
Anteriormente estaba usando
UTC
métodos al realizar las transformaciones de fecha, que era incorrecta. Al agregar el desplazamiento al tiempo, el uso de lasget
funciones locales devolverá los resultados deseados.fuente
timezone_offset
?timezone_offset
debería haber sidooffset
, o viceversa. He editado mi respuesta para mostrar el nombre correcto de la variable.Me encontré con un problema similar con las pruebas unitarias (específicamente en broma cuando las pruebas unitarias se ejecutan localmente para crear las instantáneas y luego el servidor CI se ejecuta (potencialmente) en una zona horaria diferente, lo que hace que falle la comparación de instantáneas). Me burlé de nuestros
Date
y algunos de los métodos de apoyo de esta manera:fuente
Intente usar ctoc de npm. https://www.npmjs.com/package/ctoc_timezone
Tiene una funcionalidad simple para cambiar las zonas horarias (la mayoría de las zonas horarias alrededor de 400) y todos los formatos personalizados que desea que se muestren.
fuente
Sobre la base de las respuestas anteriores, estoy usando este forro nativo para convertir la cadena larga de zona horaria en la cadena de tres letras:
Esto le dará PDT o PST dependiendo de la fecha provista. En mi caso de uso particular, desarrollando en Salesforce (Aura / Lightning), podemos obtener la zona horaria del usuario en formato largo desde el back-end.
fuente
Sé que son 3 años demasiado tarde, pero tal vez pueda ayudar a alguien más porque no he encontrado algo así, excepto la biblioteca de zona horaria, que no es exactamente lo mismo que está pidiendo aquí.
He hecho algo similar para la zona horaria alemana, esto es un poco complejo debido al horario de verano y a los años bisiestos donde tienes 366 días.
Es posible que necesite un poco de trabajo con la función "isDaylightSavingTimeInGermany", mientras que las 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
Me he esforzado por documentarlo, por lo que no será tan confuso.
fuente
Pruebe: date-from-timezone , resuelve la fecha esperada con la ayuda de disponible de forma nativa
Intl.DateTimeFormat
.Utilicé ese método en uno de mis proyectos durante algunos años, pero ahora decidí publicarlo como un pequeño proyecto de SO :)
fuente
Quizás esto te ayude
fuente
Para los usuarios de Ionic, tuve un infierno con esto porque
.toISOString()
tiene que usarse con la plantilla html.Esto tomará la fecha actual, pero por supuesto se puede agregar a las respuestas anteriores para una fecha seleccionada.
Lo solucioné usando esto:
El * 60000 indica el UTC -6, que es CST, por lo que se necesita cualquier TimeZone, se puede cambiar el número y la diferencia.
fuente
Estaba enfrentando el mismo problema, usé este
Console.log (Date.parse ("13 de junio de 2018 10:50:39 GMT + 1"));
Devolverá milisegundos a los que puede verificar tener +100 timzone intialize British time ¡Espero que ayude!
fuente