Tengo una página web con tres menús desplegables por día, mes y año. Si uso el Date
constructor de JavaScript que toma números, entonces obtengo un Date
objeto para mi zona horaria actual:
new Date(xiYear, xiMonth, xiDate)
Indique la fecha correcta, pero cree que esa fecha es GMT + 01: 00 debido al horario de verano.
El problema aquí es que luego paso esto Date
a un método Ajax y cuando la fecha se deserializa en el servidor, se convierte a GMT y, por lo tanto, pierde una hora, lo que hace que el día retroceda. Ahora podría pasar el día, mes y año individualmente al método Ajax, pero parece que debería haber una mejor manera.
La respuesta aceptada me señaló en la dirección correcta, sin embargo, solo el uso setUTCHours()
por sí mismo cambió:
Apr 5th 00:00 GMT+01:00
a
Apr 4th 23:00 GMT+01:00
Luego también tuve que establecer la fecha UTC, mes y año para terminar con
Apr 5th 01:00 GMT+01:00
que es lo que quería
fuente
Respuestas:
usarlo
.setUTCHours()
sería posible establecer fechas en tiempo UTC, lo que le permitiría usar tiempos UTC en todo el sistema.Sin embargo, no puede configurarlo utilizando UTC en el constructor, a menos que especifique una cadena de fecha.Utilizando
new Date(Date.UTC(year, month, day, hour, minute, second))
puede crear un objeto de fecha a partir de una hora UTC específica.fuente
Esta respuesta está diseñada específicamente para la pregunta original, y no dará la respuesta que necesariamente espera. En particular, algunas personas querrán restar el desplazamiento de la zona horaria en lugar de agregarlo. Sin embargo, recuerde que el objetivo de esta solución es hackear el objeto de fecha de javascript para una deserialización particular, no ser correcto en todos los casos.
fuente
*60*1000
es más claro en este caso; en otras palabras, es bastante evidente por qué está allí.Creo que necesita la función createDateAsUTC (compárela con convertDateToUTC )
fuente
date
en la zona horaria UTC, pero el segundo parece no estar haciendo nada útil. (devuelve la misma fecha quedate
)Date
objeto de JavaScript siempre reflejará la época de Unix basada en UTC y la zona horaria local . El síntoma es evidente cuando llamatoString
al objeto de fecha resultante y aún ve la zona horaria local, aunque esperaba que estuviera en UTC.Date
objeto JavaScript . Otra forma de ver esto aquí es queDate.UTC
espera valores basados en UTC, y lo está alimentando con valores de hora local, y viceversa con elDate
constructor.Simplemente configure la zona horaria y regrese de acuerdo
fuente
No creo que esto sea posible: no existe la posibilidad de establecer la zona horaria en un objeto Fecha después de que se crea.
Y en cierto modo, esto tiene sentido: conceptualmente (si tal vez no en la implementación); por http://en.wikipedia.org/wiki/Unix_timestamp (énfasis mío):
Una vez que haya construido uno, representará un cierto punto en tiempo "real". La zona horaria solo es relevante cuando desea convertir ese punto de tiempo abstracto en una cadena legible por humanos.
Por lo tanto, tiene sentido que solo pueda cambiar la hora real que representa la Fecha en el constructor. Lamentablemente, parece que no hay forma de pasar en una zona horaria explícita, y el constructor al que está llamando (posiblemente correctamente) traduce sus variables de tiempo "locales" en GMT cuando las almacena canónicamente, por lo que no hay forma de usar el
int, int, int
constructor para GMT veces.En el lado positivo, es trivial usar solo el constructor que toma una cadena en su lugar. Ni siquiera tiene que convertir el mes numérico en una Cadena (al menos en Firefox), por lo que esperaba que una implementación ingenua funcionara. Sin embargo, después de probarlo, funciona correctamente en Firefox, Chrome y Opera, pero falla en Konqueror ("Fecha inválida"), Safari ("Fecha inválida") e IE ("NaN"). Supongo que solo tendría una matriz de búsqueda para convertir el mes en una cadena, así:
fuente
Sé que esto es antiguo, pero si te ayuda, podrías usar el momento y la zona horaria del momento. Si no los ha visto, eche un vistazo.
http://momentjs.com/timezone/
http://momentjs.com/
dos bibliotecas de manipulación del tiempo realmente útiles.
fuente
Si desea lidiar con el problema ligeramente diferente, pero relacionado, de crear un objeto Fecha de Javascript desde año, mes, día, ..., incluida la zona horaria , es decir, si desea analizar una cadena en una Fecha, entonces usted aparentemente tiene que hacer un baile exasperantemente complicado:
Es decir, crea una 'hora UTC' utilizando la fecha sin zona horaria (para que sepa en qué localidad se encuentra, es decir, la 'localidad' UTC, y no está predeterminada en la local), y luego aplique manualmente el desplazamiento de la zona horaria indicada.
¿No hubiera sido bueno si alguien hubiera pensado en el objeto de fecha Javascript por más de, oooh, cinco minutos ...
fuente
para todos los desplazamientos de ubicación Wiki Lista de desplazamientos de hora UTC
fuente
getTimeZoneOffset es negativo para UTC + z.
fuente
Esto puede ayudar a alguien, poner UTC al final de lo que pasa al nuevo constructor
Al menos en cromo puedes decir
var date = new Date("2014-01-01 11:00:00 UTC")
fuente
+0000
(notó que el espacio entre 00 y UTC debe eliminarse) y esto funcionará tanto en Firefox como en Chrome. Sin embargo, no estoy seguro para Safari. (Referencia: stackoverflow.com/a/17545854/1273587 )Solución de una línea
En lugar de 1422524805305, use la marca de tiempo en milisegundos En lugar de 330, use el desplazamiento de su zona horaria en minutos wrt. GMT (por ejemplo, India +5: 30 es 5 * 60 + 30 = 330 minutos)
fuente
fuente
La forma más fácil que he encontrado para obtener la fecha correcta es usando datejs.
http://www.datejs.com/
Recibo mis fechas a través de Ajax en este formato como una cadena: '2016-01-12T00: 00: 00'
La consola leerá:
Lun 11 de enero de 2016 19:00:00 GMT-0500 (hora estándar del este)
Martes 12 de enero de 2016 00:00:00 GMT-0500 (hora estándar del este)
https://jsfiddle.net/vp1ena7b/3/
El 'addMinutes' proviene de datejs, probablemente podría hacerlo en js puro por su cuenta, pero ya tenía datejs en mi proyecto, así que encontré una manera de usarlo para obtener las fechas correctas.
Pensé que esto podría ayudar a alguien ...
fuente
cualquier kilometraje en
fuente
Este código devolverá su objeto Date formateado con la zona horaria del navegador .
Editar:
Para evitar contaminar la API de fecha, la función anterior se puede transformar en una función de utilidad. La función toma un objeto Date y devuelve un objeto Date mutado.
fuente
La mejor solución que he visto de esto provino de
http://www.codingforums.com/archive/index.php/t-19663.html
Función de tiempo de impresión
Ejemplo de código completo
fuente
si desea verificar la diferencia en un tiempo entre dos fechas, simplemente puede verificar si la segunda zona horaria es menor o mayor que la primera zona horaria deseada y restar o agregar una hora.
fuente
GMT -03: 00 Ejemplo
O incluso
fuente
Esto funcionó para mí. Sin embargo, no estoy seguro de si es una buena idea.
fuente
Usé el paquete timezone-js.
fuente
Esta es la MEJOR solución
Utilizando:
Código:
Versión café:
fuente