Quiero analizar la fecha sin zona horaria en JavaScript. Yo he tratado:
new Date(Date.parse("2005-07-08T00:00:00+0000"));
Vuelve viernes 08 de julio de 2005 02:00:00 GMT + 0200 (horario de verano de Europa Central)
new Date(Date.parse("2005-07-08 00:00:00 GMT+0000"));
Devuelve el mismo resultado
new Date(Date.parse("2005-07-08 00:00:00 GMT-0000"));
Devuelve el mismo resultado
Quiero analizar el tiempo:
Sin zona horaria.
Sin llamar al constructor Date.UTC o nueva fecha (año, mes, día).
Simplemente pasa una cadena al constructor de fecha (sin enfoques prototipo).
Tengo que
Date
objetar producto , noString
.
Date.parse
BTW y pasar directamente la cadena alDate
constructor.Date
objeto para obtener el objeto correcto para comparar fechas en MongoDB:new Date(dateStart.getFullYear(), dateStart.getMonth(), dateStart.getDate())
Respuestas:
La fecha se analiza correctamente, solo toString lo convierte a su zona horaria local:
Los objetos de fecha de Javascript son marcas de tiempo, simplemente contienen varios milisegundos desde la época. No hay información de zona horaria en un objeto Date. La fecha del calendario (día, minutos, segundos) que representa esta marca de tiempo depende de la interpretación (uno de los
to...String
métodos).El ejemplo anterior muestra que la fecha se analiza correctamente, es decir, en realidad contiene una cantidad de milisegundos correspondiente a "2005-07-08T11: 22: 33" en GMT.
fuente
new Date(Date.parse("2005-07-08T11:22:33+0000"))
, y la fecha copiado a través de constructor:new Date(dateStart.getFullYear(), dateStart.getMonth(), dateStart.getDate())
. Ambas soluciones, resultados diferentes, segundo correcto! Su respuesta fue útil, solo mencionada en hunlock.com/blogs/Javascript_Dates-The_Complete_Reference . Arriba.Tengo el mismo problema. Obtengo una fecha como String, por ejemplo: '2016-08-25T00: 00: 00', pero necesito tener un objeto Date con la hora correcta. Para convertir String en objeto, uso getTimezoneOffset:
getTimezoneOffset()
devolverá el valor negativo o positivo del éter. Esto debe restarse para que funcione en todos los lugares del mundo.fuente
var userTimezoneOffset = date.getTimezoneOffset()*60000;
getTimezoneOffset()
devuelve el número de minutos en la dirección opuesta a la que pensarías: mi zona horaria es UTC-4 en este momento perogetTimezoneOffset()
devuelve un 240 positivo. PoruserTimezoneOffset
lo tanto, se debe restar de éldate.getTime()
, no agregarlo.new Date('2016-08-25T00:00:00Z')
que creo que el punto era manipularnew Date('2016-08-25T00:00:00Z')
para que la hora local se muestre con la hora 0:00 pero este código se perdióZ
Me encontré con el mismo problema y luego recordé algo extraño sobre un proyecto heredado en el que estaba trabajando y cómo manejaron este problema. No lo entendí en ese momento y realmente no me importó hasta que me encontré con el problema.
Por alguna razón, pasar la fecha como '01 -02-2014 'establece la zona horaria en cero e ignora la zona horaria del usuario. Esto puede ser una casualidad en la clase Fecha pero existió hace algún tiempo y existe hoy. Y parece funcionar entre navegadores. Pruébalo por ti mismo.
Este código se implementa en un proyecto global donde las zonas horarias importan mucho, pero a la persona que mira la fecha no le importa el momento exacto en que se introdujo.
fuente
2014/5/31
y2014/05/31
son sábados el 31 de mayo de 2014 00:00:00 GMT-0600 (Mountain Daylight Time) `(MDT es mi zona horaria actual). Con guiones ... todos los navegadores interpretan el2014-05-31
viernes 30 de mayo de 2014 18:00:00 GMT-0600 (Mountain Daylight Time). Curiosamente, con2014-5-31
Chrome regresa el sábado, Firefox regresa el viernes e IE11 dice que la fecha no es válida. Parece que undate.replace('-','/')
poder haría el truco.El
Date
objeto en sí contendrá la zona horaria de todos modos, y el resultado devuelto es el efecto de convertirlo a una cadena de forma predeterminada. Es decir, no puede crear un objeto de fecha sin zona horaria. Pero lo que puede hacer es imitar el comportamiento delDate
objeto creando uno propio. Sin embargo, es mejor entregarlo a bibliotecas como moment.js .fuente
Solución simple
fuente
La fecha en javascript es simple por dentro. entonces los datos de fecha y hora se almacenan en UTC unix epoch (milisegundos o ms).
Si desea tener una hora "fija" que no cambie en la zona horaria que se encuentre en la Tierra, puede ajustar la hora en UTC para que coincida con su zona horaria local actual y guardarla. Y cuando lo recupere, en la zona horaria local en la que se encuentre, mostrará la hora UTC ajustada según la persona que la guardó y agregará el desplazamiento de la zona horaria local para obtener la hora "fija".
Para guardar la fecha (en ms)
Para recuperar / mostrar fecha (en ms)
Entonces tú puedes:
fuente
Puedes usar este código
fuente
Dado que es realmente un problema de formato cuando se muestra la fecha (por ejemplo, se muestra en la hora local), me gusta usar el nuevo objeto (ish) Intl.DateTimeFormat para realizar el formateo, ya que es más explícito y proporciona más opciones de salida:
Como se muestra, al configurar la zona horaria en 'UTC' no realizará conversiones locales. Como beneficio adicional, también le permite crear salidas más pulidas. Puede leer más sobre el objeto Intl.DateTimeFormat de Mozilla - Intl.DateTimeFormat .
Editar:
Se puede lograr la misma funcionalidad sin crear un nuevo
Intl.DateTimeFormat
objeto. Simplemente pase las opciones de configuración regional y fecha directamente a latoLocaleDateString()
función.fuente
Solo una nota genérica. Una forma de mantenerlo flexible.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date
Podemos usar getMinutes (), pero solo devuelve un número durante los primeros 9 minutos.
fuente
(new Date().toString()).replace(/ \w+-\d+ \(.*\)$/,"")
Esto tendrá salida: martes 10 de julio de 2018 19:07:11
(new Date("2005-07-08T11:22:33+0000").toString()).replace(/ \w+-\d+ \(.*\)$/,"")
Esto tendrá salida: Vie 08 de julio 2005 04:22:33
Nota: El tiempo devuelto dependerá de su zona horaria local.
fuente
Esta es la solución que se me ocurrió para este problema que funciona para mí.
biblioteca utilizada: momentjs con JavaScript simple Clase de fecha.
Paso 1. Convertir la fecha de cadena en objeto de momento (PS: momento conserva la fecha y hora originales siempre que
toDate()
no se llame al método):const dateMoment = moment("2005-07-08T11:22:33+0000");
Paso 2. Extraer
hours
yminutes
valores del objeto de momento creado previamente:Paso 3. Convierta el momento a la fecha (PD: esto cambiará la fecha original según la zona horaria de su navegador / máquina, pero no se preocupe y lea el paso 4):
Paso 4. Establezca manualmente las horas y minutos extraídos en el Paso 2.
El paso 5
dateObj
ahora mostrará la fecha original sin ninguna diferencia de zona horaria. Incluso los cambios de horario de verano no tendrán ningún efecto en el objeto de fecha, ya que estamos configurando manualmente las horas y minutos originales.Espero que esto ayude.
fuente
Hay algunos problemas inherentes con el análisis de fechas que desafortunadamente no se abordan bien de manera predeterminada.
-Las fechas legibles para humanos tienen una zona horaria implícita en ellas
-Hay muchos formatos de fecha ampliamente utilizados en la web que son ambiguos
Para resolver estos problemas de manera fácil y limpia, se necesitaría una función como esta:
¡He buscado esto, pero no encontré nada como eso!
Entonces creé: https://github.com/zsoltszabo/timestamp-grabber
¡Disfrutar!
fuente