Comment analyser les dates des fichiers du calendrier avec JavaScript?

Nous devons utiliser JavaScript sur le navigateur pour lire et analyser les fichiers du calendrier (.ics) (également appelés formats iCal). J'ai écrit une fonction personnalisée pour lire ces valeurs, puis utiliser la fonction Date de JavaScript () pour créer un objet de données.

Est-ce que c'est un moyen plus facile et meilleur de le faire? Regardez ma fonction (ci-dessous), vos commentaires seront les bienvenus.

Une valeur de date typique à partir d'un fichier .ics ressemble à ceci:

DTSTART: 20110914T184000Z

Besoin de le séparer au côlon, alors:

var strData = 'DTSTART:20110914T184000Z' var x = strData.indexOf(":"); var strVal = strData.slice(x + 1 ); 

Ensuite, appelez une fonction qui renvoie un objet de date:

 var dateObj = calenDate(strVal); 

// date résultanteObj valeur: ven 14 oct 2011 18:40:00 GMT-0400 (heure avancée de l'Est)

Voici la fonction qui analyse la date.

 function calenDate(icalStr) { // icalStr = '20110914T184000Z' var strYear = icalStr.substr(0,4); var strMonth = icalStr.substr(4,2); var strDay = icalStr.substr(6,2); var strHour = icalStr.substr(9,2); var strMin = icalStr.substr(11,2); var strSec = icalStr.substr(13,2); var oDate = new Date(strYear,strMonth, strDay, strHour, strMin, strSec) return oDate; } 

Je pense que quelque chose ne va pas, car le mois est mauvais.

Pour une raison impaire, le paramètre du mois est basé sur zéro ( référence ).

Changez cette ligne dans votre fonction.

 var strMonth = icalStr.substr(4,2); 

pour ça:

 var strMonth = parseInt(icalStr.substr(4,2),10)-1; 

Voir la démo de travail sur jsFiddle: http://jsfiddle.net/cTkTQ/

Une façon un peu plus robuste d'analyser les dates serait:

  var parser = XRegExp("^ (?<prefix> [^:;]+ ) # DTSTART/DTEND/DTSTAMP \n\ ((:|;TZID=(?<tz>[^:]+):)) # timezone \n\ (?<year> [0-9]{4} ) # year \n\ (?<month> [0-9]{2} ) # month \n\ (?<day> [0-9]{2} ) T # day \n\ (?<hour> [0-9]{2} ) # hour \n\ (?<minute> [0-9]{2} ) # minute \n\ (?<second> [0-9]{2} ) # second \n\ (?<utc> Z? ) # utc", "x"); parts = parser.exec (d); var od = new Date (parseInt (parts.year, 10), parseInt (parts.month, 10) - 1, parseInt (parts.day, 10), parseInt (parts.hour, 10), parseInt (parts.minute, 10), parseInt (parts.second, 10)); 

Cela nécessite que vous ajoutiez une dépendance supplémentaire (minuscule), XRegExp , qui pourrait être un peu surdimensionné en fonction de vos besoins supplémentaires, mais elle permet une analyse correcte et facile à lire de regexp du format de date dans les fichiers .ics. Cela prend également en compte l'identifiant du fuseau horaire, si la date n'est pas UTC. Je vous laisse ajouter une bonne manipulation des fuseaux horaires ainsi que l'utilisation de la partie prefix .

La réponse courte (comme l'a noté jessegavin) est cependant que le month paramètre du constructeur s'attend à un nombre compris entre 0-11 (reportez Mozilla Developer Network pour plus d'informations). Cependant, parseInt() essaie d'analyser les zéros parseInt() comme radix 8 (octal), vous devez donc vous assurer d'ajouter radix 10 , ce serait le second paramètre à parseInt(string [, radix]) .

Il s'agit d'un nouveau paquet (avec des tests) qui semble fonctionner bien: ical-date-parser

Usage

 import iCalDateParser from 'ical-date-parser'; iCalDateParser('20140422T233000Z');