J'ai une date au format chaîne 'Wed, 08 Apr 2020 15:24:06 IST' Je veux la convertir en date javascript afin de pouvoir effectuer des opérations. Je veux obtenir la date UTC d'IST ou tout ce qui est passé par l'API et je dois la convertir selon le fuseau horaire de l'utilisateur, donc je ne peux pas en supprimer IST. IST (Indian Standard Time) est juste un exemple, il pourrait être AET (Australian Eastern Time), EET (Eastern European Time), etc ...

new Date('Wed, 08 Apr 2020 15:24:06 IST')

Je reçois une date non valide

Cette chaîne provient des flux RSS Times Of India, tels que celui-ci. Comment gérer les abréviations de fuseau horaire dans les flux RSS?

1
Akshay Prajapati 8 avril 2020 à 13:39

3 réponses

Meilleure réponse

Sans contexte supplémentaire, ce n'est pas possible. Les abréviations de fuseau horaire ne sont pas normalisées ni uniques.

Dans votre exemple, vous avez dit que IST signifie "heure standard indienne" pour vous, mais IST est également utilisé pour "heure standard d'Israël" et "heure standard irlandaise". Tous ont des décalages de fuseau horaire très différents.

Un autre exemple courant est CST, qui peut être "Heure normale du Centre", "Heure standard de Cuba" ou "Heure standard de Chine".

Au lieu de cela, vous devez revenir à la source d'origine et obtenir un décalage de fuseau horaire (tel que +05:30) ou un identifiant de fuseau horaire (tel que Asia/Kolkata), ou dériver ce contexte d'une autre manière.

Vous avez indiqué que vous récupériez cet horodatage à partir de un flux RSS de Times of India. C'est le type de contexte supplémentaire dont je parle. Puisque vous savez qu'il s'agit d'une source d'actualités indienne, vous pouvez supposer en toute sécurité que IST signifie heure normale de l'Inde.

Vous devez savoir que le format du flux RSS de Times of India n'utilise pas correctement les horodatages. La spécification RSS 2.0 requiert que les horodatages soient dans format RFC 822. Dans ce format, IST n'est pas un fuseau horaire valide. En effet, si vous le placez sur un site comme Feed Validator, cela vous donnera l'erreur "doit être une date-heure RFC-822".

Notez que la RFC 822 est ancienne et obsolète. Il a été remplacé par RFC 2822, puis à nouveau par RFC 5322. Les abréviations de fuseau horaire ont toutes été obsolètes et déplacées vers le obs-zone section. Ainsi, ils ne devraient vraiment pas être utilisés du tout. Seuls les décalages numériques doivent apparaître. Cela dit, beaucoup d'implémentations RSS suivent l'ancienne norme, et il est donc raisonnable d'accepter certaines des abréviations spécifiées dans obs-zone. Plus précisément, toutes les implémentations doivent accepter les éléments suivants:

"Z"    == "+0000"
"UT"   == "+0000"
"GMT"  == "+0000"
"EST"  == "-0500"
"EDT"  == "-0400"
"CST"  == "-0600"
"CDT"  == "-0500"
"MST"  == "-0700"
"MDT"  == "-0600"
"PST"  == "-0800"
"PDT"  == "-0700"

(Les autres zones militaires "A" - "Y" ne doivent jamais être utilisées.)

Notez que IST n'en fait pas partie. Ainsi, pour répondre directement à votre question, lors de l'analyse d'un horodatage RFC 822 qui contient une abréviation de fuseau horaire non standard, vous devrez remplacer l'abréviation par un décalage vous-même avant l'analyse. Dans ce cas:

var s = 'Wed, 08 Apr 2020 15:24:06 IST';
var d = new Date(s.replace('IST', '+0530'));

Vous pouvez également remplacer les autres obs-zone abréviations que j'ai répertoriées, mais cela ne devrait généralement pas être nécessaire. La plupart des implémentations d'ECMAScript les analysent (même si elles ne sont pas requises par les spécifications).

Si vous rencontrez d'autres flux RSS avec d'autres abréviations de fuseau horaire, vous devrez déterminer manuellement comment les interpréter. Il n'y a pas de liste définitive.

Quelques lectures supplémentaires:

1
Matt Johnson-Pint 10 avril 2020 à 17:01

Essaye ça:

moment('Wed, 08 Apr 2020 15:24:06').utc();

Et vous obtenez une erreur à cause d'IST, supprimez simplement cela et cela ne vous donnera pas d'erreur

Si vous ne voulez que la date, utilisez ceci:

moment('Wed, 08 Apr 2020 15:24:06').utc().format('YYYY-MM-DD');
0
Armash Ansari 8 avril 2020 à 10:52

Si vous souhaitez analyser ou afficher un moment en UTC, vous pouvez utiliser moment.utc ()

var res = moment.utc("Wed, 08 Apr 2020 15:24:06",'DD-MMM-YYYY').format("YYYY-MM-DD");
console.log(res);
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/moment.min.js"></script>
0
vjr12 8 avril 2020 à 11:24