web-dev-qa-db-fra.com

Quelles sont les chaînes de date et heure valides en JavaScript?

Lors de l'utilisation de new Date ou Date.parse en JavaScript, je ne peux pas simplement transmettre des formats de date arbitraires. En fonction du format, j'obtiens une date différente de celle souhaitée ou même Invalid Date au lieu d'un objet de date. Certains formats de date fonctionnent dans un navigateur mais pas dans d'autres. Alors, quels formats de date et heure dois-je utiliser?

Questions supplémentaires:

  • Est-ce que tous les navigateurs supportent les mêmes formats? Comment Mozilla Firefox, Google Chrome, Microsoft Internet Explorer, Microsoft Edge et Apple Safari gèrent-ils les chaînes de date et heure? Qu'en est-il de Node.js?

  • Prend-il en compte le format de date local? Par exemple. si je vis en Suisse et que le format de la date est le 30.07.2018, puis-je utiliser new Date('30.07.2018')?

  • Prend-il en compte le fuseau horaire local?

  • Comment puis-je obtenir une chaîne d'heure date à partir d'un objet date?

  • Comment détecter des chaînes de date/heure invalides?

  • Comment les bibliothèques de dates telles que Moment.js gèrent-elles les chaînes de dates?

Au cas où vous ne l'auriez pas remarqué, j'ai répondu à ma propre question ( pourquoi? ).

8
str

Alors, quels formats de date et heure dois-je utiliser?

La recommandation générale est de ne pas utiliser l'analyseur intégré du tout car il n'est pas fiable. La réponse à "devrait" est "none". Voir Pourquoi Date.parse donne-t-il des résultats incorrects?

Cependant, comme le dit str, vous pouvez probablement utiliser le format spécifié dans ECMA-262 avec un fuseau horaire: YYYY-MM-DDTHH:mm:ss.sssZ ou YYYY-MM-DDTHH:mm:ss.sss±HH:mm, ne faites confiance à aucun autre format.

Est-ce que tous les navigateurs supportent les mêmes formats?

Non.

Comment Mozilla Firefox, Google Chrome, Microsoft Internet Explorer, Microsoft Edge et Apple Safari gèrent-ils les chaînes de date et heure?

Différemment. Tout format autre que le format dans ECMA-262 dépend de la mise en œuvre et l'analyse du format ECMA-262 présente des bogues.

Qu'en est-il de Node.js?

Probablement différent encore, voir ci-dessus.

Prend-il en compte le format de date local? Par exemple. si j'habite en Suisse et que le format de date est le 30.07.2018, puis-je utiliser la nouvelle date ('30.07.2018 ')?

Peut être. Comme ce n'est pas le format standard, l'analyse dépend de l'implémentation, alors peut-être que non.

Prend-il en compte le fuseau horaire local?

Il utilise le décalage du fuseau horaire de l'hôte, où la chaîne est analysée en tant que local et permet de générer la chaîne affichée à l'aide des heures locales. Sinon, il utilise UTC (et la valeur de l'heure interne est UTC).

Comment puis-je obtenir une chaîne d'heure date à partir d'un objet date?

Date.parse.toString , ou voir Où puis-je trouver de la documentation sur le formatage d'une date en JavaScript?

Comment détecter des chaînes de date/heure invalides?

Une des 3 premières réponses ici devrait répondre à cela.

Comment les bibliothèques de dates telles que Moment.js gèrent-elles les chaînes de dates?

Ils les analysent en fonction d'un format par défaut ou fourni. Lisez le code source (par exemple, fecha.js est un analyseur et un formateur simples avec du code bien écrit et facile à suivre). 

Un analyseur n'est pas difficile à écrire, mais essayer de deviner le format d'entrée (comme le font souvent les analyseurs intégrés) est lourd, peu fiable et incohérent d'une implémentation à l'autre. Par conséquent, l'analyseur doit exiger que le format soit fourni, sauf si la chaîne d'entrée est dans le format par défaut de l'analyseur.

PS

Des modifications ont été apportées aux formats de chaînes que les implémentations doivent prendre en charge pour l'analyse et le formatage dans ECMAScript 2019 (actuellement en projet), mais je pense que le conseil général visant à éviter l'analyseur intégré sera valable jusqu'à un certain temps.

1
RobG