¿Cómo analizo un formato de cadena de fecha UTC en hora local de fecha?
-
21-09-2019 - |
Pregunta
Actualmente estoy usando el jQuery Plugin fullcalendar pero he encontré con un problema relacionado con el horario de verano tiempo en Gran Bretaña. Después de los cambios de horario surtan efecto las horas se visualizan una hora fuera de fase.
El problema parece ser con los plugins función de análisis. Por favor alguien puede ofrecerle la Funciton a analizar una cadena que incluye el UTC demonination 'Z' en una fecha y hora local para la pantalla?
Solución
Después de cierta confusión inicial (respuestas por mí y Andy E y principalmente mis comentarios a su respuesta), que es probable que se contestaron todas formas, he descubierto lo que parece ser la verdadera causa de su problema.
El plugin internamente utiliza el mismo código de la función parseISO8601
que fue propuesto por Andy E que viene de Analizar del W3C ISO 8601 fecha / horas en JavaScript .
Sin embargo, a pesar de Andy E indica que ese código funciona sin problemas, el plugin fullcalendar, que utiliza ese código también parece tener un error.
Después de mirar más de cerca el código, me di cuenta de que el plugin parece ignorar la zona horaria que se encuentra.
Comparar estos fragmentos de código
Fragmento de código original de delete.me.uk
if (d[14]) {
offset = (Number(d[16]) * 60) + Number(d[17]);
offset *= ((d[15] == '-') ? 1 : -1);
}
Código de fullcalendar.js
if (!ignoreTimezone) {
if (m[14]) {
offset = Number(m[16]) * 60 + Number(m[17]);
offset *= m[15] == '-' ? 1 : -1;
}
offset -= date.getTimezoneOffset();
}
Como se puede ver el plugin sólo se ocupa de la zona horaria si ignoreTimezone
se establece en false. Pero eso simplemente nunca es el caso. parseISO8601()
en este plugin se llama siempre con juego ignoreTimezone
true.
Por lo tanto apuesto a que el fallo viene de esto y usted debe considerar ponerse en contacto con el autor del plugin. Pero primero debe verificar si la fecha se analiza correctamente si se establece ignoreTimezone
en false en el código del plugin
Otros consejos
Esto podría funcionar para usted:
function parseDate(value) {
var a = /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value);
if (a) {
return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4], +a[5], +a[6]));
}
return null;
}
Supongo que significa una cadena de fecha ISO 8601 ( UTC es un estándar de tiempo, no se un formato de visualización). He usado esta función de delete.me.uk durante algunos años ahora, en un entorno de producción sin problemas de pruebas en BST / GMT (mi zona horaria local).