Estoy usando Moment.js para analizar y formatear fechas en mi aplicación web. Como parte de un objeto JSON, mi servidor de fondo envía fechas como una cantidad de milisegundos desde la época UTC (desplazamiento de Unix).
Analizar fechas en una zona horaria específica es fácil: solo agregue el identificador de zona horaria RFC 822 al final de la cadena antes de analizar:
// response varies according to your timezone
const m1 = moment('3/11/2012 13:00').utc().format("MM/DD HH:mm")
// problem solved, always "03/11 17:00"
const m2 = moment('3/11/2012 13:00 -0400').utc().format("MM/DD HH:mm")
console.log({ m1, m2 })
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/moment.min.js"></script>
Pero, ¿cómo formateo una fecha en una zona horaria específica ?
Quiero resultados consistentes independientemente de la hora actual del navegador, pero no quiero mostrar las fechas en UTC.
javascript
timezone
momentjs
quietmint
fuente
fuente
DD MMM, YYYY
no funciona, cuando lo uso comomoment.tz("2018-02-15T14:20:00.000+0530", "Asia/Bangkok").format("DD MMM, YYYY")
. ¿Alguien puede señalarme en la documentación donde puedo encontrar todas las claves para formatear el tiempo cuando uso esta API?"15 Feb, 2018"
. ¿Querías usar el formato de cadenaDD MMMM, YYYY
para obtener"15 February, 2018"
?Respuestas:
Como se señaló en la respuesta de Manto ,
.utcOffset()
es el método preferido a partir del momento 2.9.0. Esta función utiliza el desplazamiento real desde UTC, no el desplazamiento inverso (por ejemplo, -240 para Nueva York durante el horario de verano). Las cadenas de desplazamiento como "+0400" funcionan igual que antes:El más antiguo
.zone()
como setter quedó en desuso en Moment.js 2.9.0. Aceptó una cadena que contiene un identificador de zona horaria (por ejemplo, "-0400" o "-04: 00" durante -4 horas) o un número que representa minutos detrás de UTC (por ejemplo, 240 para Nueva York durante el horario de verano).Para trabajar con zonas horarias con nombre en lugar de desplazamientos numéricos, incluya Moment Timezone y use
.tz()
en su lugar:fuente
.zone()
como un captador, que devuelve minutos desde UTC (por ejemplo, devuelve 300 para Nueva York durante la hora estándar).tz("America/Phoenix")
si se incluyen momentjs.com/timezone así, sin embargo. He actualizado la respuesta con un ejemplo.Usar zona horaria
Antes de poder acceder a una zona horaria en particular, deberá cargarla así (o usar los métodos alternativos descritos aquí )
fuente
Un par de respuestas ya mencionan que la zona horaria es el camino a seguir con la zona horaria con nombre. Solo quiero aclarar algo sobre esta biblioteca que fue bastante confuso para mí. Hay una diferencia entre estas dos declaraciones:
Suponiendo que no se especifica una zona horaria en la fecha pasada:
El primer código toma la fecha y asume que la zona horaria es la que se pasó. El segundo tomará la fecha, asumirá la zona horaria del navegador y luego cambiará la hora y la zona horaria de acuerdo con la zona horaria pasada.
Ejemplo:
Mi zona horaria es +5 de utc. Entonces, en el primer caso, no cambia y establece la fecha y la hora para tener la zona horaria utc.
En el segundo caso, se supone que la fecha aprobada está en -5, luego se convierte en UTC, y es por eso que escupe la fecha "2018-07-18T00: 00: 00Z"
NOTA: El parámetro de formato es realmente importante. Si se omite el momento, puede recurrir a la clase Fecha que puede comportamientos impredecibles
Asumiendo que la zona horaria se especifica en la fecha pasada:
En este caso, ambos se comportan igual
Aunque ahora entiendo por qué funciona de esa manera, pensé que era una característica bastante confusa y que valía la pena explicar.
fuente
.zone () ha quedado en desuso, y en su lugar debería usar utcOffset:
fuente
Estaba teniendo el mismo problema con Moment.js. He instalado momentzone, pero el problema no se resolvió. Luego, hice lo que aquí está expuesto, configuré la zona horaria y funciona de maravilla:
¡Muchas gracias!
fuente
new Date()
constructor. Moment proporciona todo lo que necesitas para analizar las fechas. Ver Análisis de documentos.new Date()
internamente), pero esto es inconsistente en todos los navegadores . En su lugar, debe usar proporcionar el formato esperado como segundo argumento. Ejemplo:moment("12-25-1995", "MM-DD-YYYY")
.Acabo de acreoss esto, y como tenía el mismo problema, simplemente publicaría los resultados que se me ocurrieron.
al analizar, puede actualizar el desplazamiento (es decir, estoy analizando un dato (1.1.2014) y solo quiero la fecha, 1 de enero de 2014. En GMT + 1 obtendría 31.12.2013. Así que compensé el valor primero.
Bueno, fue útil para mí apoyar en todas las zonas horarias
si
fuente
Puedes probar esto,
Aquí puede obtener la fecha en función de la zona horaria del cliente (navegador).
La expresión regular básicamente te da el valor de compensación.
¡¡Salud!!
fuente