Objetivo: buscar local time
y UTC time offset
luego construir la URL en el siguiente formato.
Ejemplo de URL: / Actions / Sleep? Duration = 2002-10-10T12: 00: 00−05: 00
El formato se basa en la recomendación del W3C: http://www.w3.org/TR/xmlschema11-2/#dateTime
La documentación dice:
Por ejemplo, 2002-10-10T12: 00: 00−05: 00 (mediodía del 10 de octubre de 2002, horario de verano central y horario estándar del este en los EE. UU.) Es igual a 2002-10-10T17: 00: 00Z, cinco horas después de 2002-10-10T12: 00: 00Z.
Entonces, según mi comprensión, necesito encontrar mi hora local por nueva Fecha () y luego usar la función getTimezoneOffset () para calcular la diferencia y luego adjuntarla al final de la cadena.
1.Obtener la hora local con formato
var local = new Date().format("yyyy-MM-ddThh:mm:ss"); //today (local time)
salida
2013-07-02T09:00:00
2.Obtener diferencia horaria de UTC por hora
var offset = local.getTimezoneOffset() / 60;
salida
7
3.Construir URL (solo parte del tiempo)
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 9 a.m. y la diferencia con respecto a UTC es de 7 horas (UTC es de 7 horas por delante de la hora local)
Hasta ahora parece funcionar, pero ¿qué pasa si getTimezoneOffset () devuelve un valor negativo como -120?
Me pregunto cómo debería verse el formato en tal caso porque no puedo averiguarlo a partir del documento W3C. Gracias por adelantado.
fuente
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 un
Z
mientras que todos los demás formatos se representan con un desplazamiento de UTC. El significado es el mismo que el de JavaScript, pero el orden de resta está invertido, por lo que el resultado lleva el signo opuesto.Además, no hay ningún método en el
Date
objeto nativo llamadoformat
, por lo que su función en el n. ° 1 fallará a menos que esté utilizando una biblioteca para lograrlo. Consulte esta documentación .Si está buscando 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:
Esta es una solución de varios navegadores bien probada y tiene muchas otras características útiles.
fuente
Creo que vale la pena considerar que puede obtener la información solicitada con solo una llamada API a la biblioteca estándar ...
Tendría que hacer un intercambio de texto si desea agregar el delimitador 'T', eliminar el 'GMT-' o agregar el ': 00' al final.
Pero luego puede jugar fácilmente con las otras opciones si lo desea, por ejemplo. utilice el tiempo de 12 horas u omita los segundos, etc.
Tenga en cuenta que estoy usando Suecia como configuración regional porque es uno de los países que usa el formato ISO 8601. Creo que la mayoría de los países ISO usan este formato 'GMT-4' para el desplazamiento de zona horaria diferente a Canadá, que usa la abreviatura de zona horaria, por ejemplo. "EDT" para el horario de verano del este.
Puede obtener lo mismo de la función estándar más nueva de i18n "Intl.DateTimeFormat ()", pero debe indicarle que incluya la hora a través de las opciones o simplemente dará la fecha.
fuente
Esta es mi función para la zona horaria de los clientes, es liviana y simple
fuente
Mira esto:
fuente
No se necesita moment.js: aquí hay una respuesta completa de ida y vuelta, desde un tipo de entrada de "datetime-local" que genera una cadena ISOLocal a UTCseconds en GMT y viceversa:
fuente
Solo mis dos envios aqui
Estaba enfrentando este problema con las fechas y horas, así que lo que hice es esto:
Luego, guarde la fecha en la base de datos para poder compararla con alguna consulta.
Instalar
moment-timezone
fuente
Mi respuesta es una ligera variación para aquellos que solo quieren la fecha de hoy en la zona horaria local en el formato AAAA-MM-DD.
Déjame ser claro:
Mi objetivo: obtener la fecha de hoy en la zona horaria del usuario pero con el formato ISO8601 (AAAA-MM-DD)
Aquí está el código:
Esto funciona porque la configuración regional de Suecia usa el formato ISO 8601.
fuente
Aquí están las funciones que usé para este fin:
fuente
Puede lograr esto con algunos métodos de extensión simples. El siguiente método de extensión de fecha devuelve solo el componente de zona horaria en formato ISO, luego puede definir otro para la parte de fecha / hora y combinarlos para una cadena completa de compensación de fecha y hora.
Uso de ejemplo:
Sé que es 2020 y la mayoría de las personas probablemente ya estén usando Moment.js, pero a veces es útil tener una solución simple de copiar y pegar.
(La razón por la que dividí los métodos de fecha / hora y desplazamiento es porque estoy usando una antigua biblioteca Datejs que ya proporciona un
toString
método flexible con especificadores de formato personalizados, pero simplemente no incluye el desplazamiento de la zona horaria. Por lo tanto, agreguétoISOLocaleString
para cualquier persona sin dicha biblioteca.)fuente