Comment puis-je analyser une chaîne de format de date UTC à date heure locale?
-
21-09-2019 - |
Question
J'utilise actuellement plugin jQuery fullcalendar mais je suis tombé sur une question au sujet de l'heure d'été temps en Grande-Bretagne. Après les économies de jour prennent effet les heures sont affichées une heure de phase.
Le problème semble être avec les plug-ins fonction d'analyse syntaxique. Quelqu'un peut-il s'il vous plaît me donner le funciton pour analyser une chaîne UTC qui comprend la demonination « Z » en date heure locale pour l'affichage?
La solution
Après une certaine confusion (réponses par moi et Andy E et surtout mes commentaires à sa réponse) que vous avez probablement manqué de toute façon, j'ai découvert ce qui semble être la cause réelle de votre problème.
Le plugin utilise en interne le même code de la fonction parseISO8601
qui a été proposée par Andy E qui vient de Parsing ISO 8601 du W3C date / Times en JavaScript .
Mais bien que Andy E indique que ce code fonctionne sans problèmes, le plugin fullcalendar, qui utilise ce code aussi, semble avoir un bug.
Après avoir examiné de plus près le code, je remarquais que le plugin semble ignorer le fuseau horaire que vous êtes.
Comparez ces extraits de code
Snippet à partir du code d'origine de delete.me.uk
if (d[14]) {
offset = (Number(d[16]) * 60) + Number(d[17]);
offset *= ((d[15] == '-') ? 1 : -1);
}
code de fullcalendar.js
if (!ignoreTimezone) {
if (m[14]) {
offset = Number(m[16]) * 60 + Number(m[17]);
offset *= m[15] == '-' ? 1 : -1;
}
offset -= date.getTimezoneOffset();
}
Comme vous pouvez le voir le plugin ne gère que le fuseau horaire si ignoreTimezone
est définie sur false. Mais c'est tout simplement jamais le cas. parseISO8601()
dans ce plug-in est toujours appelé avec set ignoreTimezone
true.
Ainsi, je parie que le bug vient de cela et vous devriez envisager de communiquer avec l'auteur du plugin. Mais d'abord, vous devez vérifier si la date s'analysée correctement si vous définissez ignoreTimezone
false dans le code du plugin
Autres conseils
Cela pourrait fonctionner pour vous:
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;
}
Je suppose que vous voulez dire une chaîne de date ISO 8601 ( UTC est une norme de temps, non un format d'affichage). Je l'ai utilisé cette fonction de delete.me.uk depuis quelques années maintenant, dans un environnement de production sans problèmes de test dans BST / GMT (mon fuseau horaire local).