now - set timezone javascript
Fecha de parse sin timezone javascript (7)
El objeto Date
sí mismo contendrá la zona horaria de todos modos, y el resultado devuelto es el efecto de convertirlo a cadena de una manera predeterminada. Es decir, no puede crear un objeto de fecha sin zona horaria. Pero lo que puedes hacer es imitar el comportamiento del objeto Date
creando tu propio objeto. Sin embargo, es mejor entregarlo a bibliotecas como moment.js .
Quiero analizar la fecha sin zona horaria en JavaScript. Yo he tratado:
new Date(Date.parse("2005-07-08T00:00:00+0000"));
Devuelve vie 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 Fecha.UTC o nueva Fecha (año, mes, día).
Simplemente pasar cadena al constructor de fecha (sin enfoques de prototipo).
Tengo que producir el objeto
Date
, noString
.
Hay algunos problemas inherentes con el análisis de la fecha que desafortunadamente no se abordan bien de manera predeterminada.
-Humanas legibles tienen zona horaria implícita en ellas
-Hay muchos formatos de fecha ampliamente utilizados en la web que son ambiguos
Para resolver estos problemas fácil y limpio uno necesitaría una función como esta:
>parse(whateverDateTimeString,expectedDatePattern,timezone)
"unix time in milliseconds"
¡He buscado esto, pero no encontré nada de eso!
Así que creé: https://github.com/zsoltszabo/timestamp-grabber
¡Disfrutar!
La fecha se analiza correctamente, solo aString la convierte a su zona horaria local:
> new Date(Date.parse("2005-07-08T11:22:33+0000"))
Fri Jul 08 2005 13:22:33 GMT+0200 (CEST)
> new Date(Date.parse("2005-07-08T11:22:33+0000")).toUTCString()
"Fri, 08 Jul 2005 11:22:33 GMT"
El objeto Fecha de Javascript son marcas de tiempo; simplemente contienen un número de 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 es una cuestión de interpretación (uno de los to...String
Métodos de to...String
).
El ejemplo anterior muestra que la fecha se está analizando correctamente, es decir, contiene una cantidad de milisegundos correspondiente a "2005-07-08T11: 22: 33" en GMT.
Me encontré con el mismo problema y luego recordé algo torpe 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 yo mismo
var date = ''2014-01-02T00:00:00.000Z''
date = date.substring(0,10).split(''-'')
date = date[1] + ''-'' + date[2] + ''-'' + date[0]
new Date(date) #Thu Jan 02 2014 00:00:00 GMT-0600
Por alguna razón, pasar la fecha en ''01 -02-2014 ''establece la zona horaria en cero e ignora la zona horaria del usuario. Esto puede ser un golpe de suerte en la clase Date, pero existió hace algún tiempo y existe hoy. Y parece funcionar en todos los navegadores. Pruébalo por ti mismo.
Este código se implementa en un proyecto global donde las zonas horarias son muy importantes, pero a la persona que mira la fecha no le importa el momento exacto en que se introdujo.
Solución simple
const handler1 = {
construct(target, args) {
let newDate = new target(...args);
var tzDifference = newDate.getTimezoneOffset();
return new target(newDate.getTime() + tzDifference * 60 * 1000);
}
};
Date = new Proxy(Date, handler1);
Tengo el mismo problema. Obtengo una fecha como String, por ejemplo: ''2016-08-25T00: 00: 00'', pero necesito tener el objeto Date con la hora correcta. Para convertir String en objeto, utilizo getTimezoneOffset:
var date = new Date(''2016-08-25T00:00:00'')
var userTimezoneOffset = date.getTimezoneOffset() * 60000;
new Date(date.getTime() + userTimezoneOffset);
Tratando de resolver el problema de la zona horaria en el objeto de fecha, tengo éxito con esta función de análisis sintáctico:
function (itemValue, inputFormat) {
var value;
if (typeof itemValue === "string") {
value = inputFormat ? moment(itemValue, inputFormat, true) : moment(itemValue);
if (value.isValid && value.isValid()) {
value = value.toDate();
}
else {
console.error("date convert error for", itemValue, inputFormat);
}
}
else if (typeof itemValue === "object" && itemValue.getTimezoneOffset) value = itemValue;
else console.error("Date value must be string or date object");
value.setMinutes(0);
value.setSeconds(0);
value.setMilliseconds(0);
value.setHours(-value.getTimezoneOffset() / 60);
console.log(value.toLocaleDateString());
return value;
}
Esta función proporciona un objeto de fecha con las horas correctas como zona horaria, así que cuando solicite value.toLocaleDateString (), obtendré la fecha correcta. Puedo usar este analizador para obtener la fecha de cualquier tipo de servidor. La biblioteca Moment es muy útil para analizar la fecha en cualquier formato, si no proporciona el formato de entrada, el momento puede detectar qué formato es, pero prefiere pasar el formato de entrada.