En mi aplicación Java Script tengo la fecha almacenada en un formato como este:
2011-09-24
Ahora, cuando trato de usar el valor anterior para crear un nuevo objeto Fecha (para poder recuperar la fecha en un formato diferente), la fecha siempre regresa un día libre. Vea abajo:
var doo = new Date("2011-09-24");
console.log(doo);
registros:
Fri Sep 23 2011 20:00:00 GMT-0400 (Eastern Daylight Time)
javascript
date
levi
fuente
fuente
Respuestas:
Observe que es el horario de verano del este
-4 hours
y que las horas en la fecha en que regresará son20
.que es la medianoche del 2011-09-24. La fecha se analizó en UTC (GMT) porque proporcionó una cadena de solo fecha sin ningún indicador de zona horaria. Si hubiera dado una cadena de fecha / hora sin un indicador en su lugar (
new Date("2011-09-24T00:00:00")
), se habría analizado en su zona horaria local. (Históricamente ha habido inconsistencias allí, sobre todo porque la especificación cambió más de una vez, pero los navegadores modernos deberían estar bien; o siempre puede incluir un indicador de zona horaria).Está obteniendo la fecha correcta, nunca especificó la zona horaria correcta.
Si necesita acceder a los valores de fecha, puede usar
getUTCDate()
o cualquiera de las otrasgetUTC*()
funciones :fuente
EDT
es el horario de verano (también conocido como horario de verano) ,EST
es la zona horaria que se aplica en enero.new Date('2012-01-01 GMT')
, todavía aplica un desplazamiento, ya que lo convierte a la fecha y hora local del usuario.get*
métodos y necesita que devuelva la fecha / hora correcta, incluido el desplazamiento de zona horaria desconocida, simplemente agregue el desplazamiento de zona horaria desconocida:d = new Date('2013-01-08 GMT'); d.setMinutes(d.getMinutes() + d.getTimezoneOffset());
esto normalizará la fecha a la ubicación del usuario para que los.get*
métodos vuelvan El valor esperado. Los.getUTC*
métodos serán incorrectos, así que tenga cuidado.Hay varias cosas locas que suceden con un objeto JS DATE que convierte cadenas, por ejemplo, considere la siguiente fecha que proporcionó
Si proporciona argumentos separados para el constructor Fecha, puede obtener otras salidas útiles como se describe a continuación
Nota: los argumentos pueden ser de tipo Número o Cadena. Mostraré ejemplos con valores mixtos.
fuente
Para normalizar la fecha y eliminar el desplazamiento no deseado (probado aquí: https://jsfiddle.net/7xp1xL5m/ ):
Esto también logra lo mismo y el crédito a @tpartee (probado aquí: https://jsfiddle.net/7xp1xL5m/1/ ):
fuente
doo.setMinutes(doo.getMinutes() + doo.getTimezoneOffset())
Si desea obtener la hora 0 de alguna fecha en la zona horaria local, pase las partes de la fecha individual al
Date
constructor.fuente
Solo quiero agregar que aparentemente agregar un espacio al final de la cadena usará UTC para la creación.
Editar: Esta no es una solución recomendada, solo una respuesta alternativa. No utilice este enfoque, ya que no está muy claro lo que está sucediendo. Hay varias formas en que alguien podría refactorizar esto causando accidentalmente un error.
fuente
Creo que tiene que ver con el ajuste de la zona horaria. La fecha que ha creado está en GMT y la hora predeterminada es medianoche, pero su zona horaria es EDT, por lo que resta 4 horas. Prueba esto para verificar:
fuente
Su problema es específicamente con la zona horaria. Nota
GMT-0400
: es decir, estás 4 horas detrás de GMT. Si agrega 4 horas a la fecha / hora mostrada, obtendrá exactamente la medianoche del 24/09/2011. Utilice eltoUTCString()
método en su lugar para obtener la cadena GMT:fuente
Probablemente esta no sea una buena respuesta, pero solo quiero compartir mi experiencia con este problema.
Mi aplicación usa globalmente utc date con el formato 'AAAA-MM-DD', mientras que el plugin datepicker que uso solo acepta js date, es difícil para mí considerar utc y js. Entonces, cuando quiero pasar una fecha con formato 'AAAA-MM-DD' a mi selector de fechas, primero la convierto al formato 'MM / DD / AAAA' usando moment.js o lo que desee, y la fecha se muestra en datepicker ahora correcto. Por su ejemplo
Al parecer, d1 es lo que quiero. Espero que esto sea útil para algunas personas.
fuente
Esto a través de mí para un bucle, +1 en la respuesta de zzzBov. Aquí hay una conversión completa de una fecha que funcionó para mí usando los métodos UTC:
fuente
Significa
2011-09-24 00:00:00 GMT
, y ya que estás enGMT -4
, será20:00
el día anterior.Personalmente, entiendo
2011-09-24 02:00:00
, porque estoy viviendo enGMT +2
.fuente
Aunque en el caso del OP la zona horaria es EDT, no hay garantía de que el usuario que ejecuta su script esté en la zona horaria EDT, por lo que codificar el desplazamiento no necesariamente funcionará. La solución que encontré divide la cadena de fecha y usa los valores separados en el constructor de fecha.
Tenga en cuenta que debe tener en cuenta otra parte de la rareza de JS: el mes está basado en cero.
fuente
Encontré este problema exacto donde mi cliente estaba en hora estándar del Atlántico. El valor de la fecha que el cliente recuperó fue "2018-11-23" y cuando el código lo pasó a
new Date("2018-11-23")
la salida para el cliente fue para el día anterior. Creé una función de utilidad como se muestra en el fragmento que normalizó la fecha, dando al cliente la fecha esperada.date.setMinutes(date.getMinutes() + date.getTimezoneOffset());
fuente
si solo está buscando asegurarse de que las partes individuales de la fecha se mantengan igual para fines de visualización, * esto parece funcionar, incluso cuando cambio mi zona horaria:
simplemente agregue los ceros allí.
En mi código hago esto:
Y cambio mi zona horaria en mi computadora y la fecha sigue siendo la misma que la cadena de fecha aaaa-mm-dd que obtengo de la API.
Pero me estoy perdiendo algo / ¿es una mala idea?
* al menos en cromo. ¡Esto no funciona en Safari! a partir de este escrito
fuente
.toISOString()
, vuelve 1 día atrás.new Date('2019/11/18 05:30:00').toISOString();
funcionó para míLa mejor manera de manejar esto sin usar más métodos de conversión,
Ahora solo agregue GMT en su fecha o puede agregarlo.
Live: https://jsfiddle.net/gajender/2kop9vrk/1/
fuente
Me enfrenté a un problema como este. Pero mi problema fue el conjunto al obtener la fecha de la base de datos.
esto se almacena en la base de datos y está en formato UTC.
Entonces, cuando llego de la base de datos y verifico la fecha, agrega un desplazamiento con ella y la envío de vuelta a JavaScript.
Está agregando +05: 00 porque esta es la zona horaria de mi servidor. Mi cliente está en una zona horaria diferente +07: 00.
Así que aquí está mi solución, lo que hago con este problema.
Entonces, cuando la fecha proviene del servidor y tiene un desplazamiento del servidor, así que divido la fecha y elimino el desplazamiento del servidor y luego lo convierto en fecha. Resuelve mi problema.
fuente
si necesita una solución simple para esto, vea:
fuente
Está utilizando el formato de cadena de fecha ISO que, de acuerdo con esta página , hace que la fecha se construya utilizando la zona horaria UTC:
Si formatea el texto de manera diferente, por ejemplo
"Jan 01 1970"
, (al menos en mi máquina) usa su zona horaria local.fuente
Intentando agregar mis 2 centavos a este hilo (elaborando sobre la respuesta de @ paul-wintz).
Me parece que cuando el constructor de fecha recibe una cadena que coincide con la primera parte del formato ISO 8601 (parte de fecha), realiza una conversión de fecha precisa en la zona horaria UTC con 0 hora. Cuando esa fecha se convierte a la hora local, puede ocurrir un cambio de fecha si la medianoche UTC es una fecha anterior en la zona horaria local.
Si la cadena de fecha está en cualquier otro formato "más flexible" (usa "/" o la fecha / mes no está rellenada con cero), crea la fecha en la zona horaria local, por lo que no hay problema de cambio de fecha.
Entonces, una solución rápida, como se mencionó anteriormente, es reemplazar "-" con "/" en su cadena de fecha con formato ISO solamente.
fuente
Para almacenar
yyyy-mm-dd
en formato de fecha MySql, debe hacer lo siguiente:fuente
Su registro genera GMT, por lo que desea especificar su zona horaria:
fuente
no importa, no noté el GMT -0400, que hace que la fecha sea ayer
Puede intentar establecer un "tiempo" predeterminado para que sea 12:00:00
fuente
Lo siguiente funcionó para mí:
fuente