web-dev-qa-db-fra.com

JavaScript Intl.DateTimeFormat.format vs Date.toLocaleString

Je voudrais imprimer une chaîne représentant une date, en utilisant un fuseau horaire, des paramètres régionaux et des options d'affichage spécifiques.

Laquelle de celles-ci dois-je utiliser?

  1. Intl.DateTimeFormat.prototype.format
  2. Date.prototype.toLocaleString ()

Il semble qu'ils retournent des résultats identiques.

const event = new Date(1521065710000);

const options = {
  day: 'numeric',
  month: 'long',
  weekday: 'short',
  hour: 'numeric',
  minute: 'numeric',
  timeZoneName: 'short',
  timeZone: 'America/Los_Angeles',
};

console.log(event.toLocaleString('en-US', options));
// "Wed, March 14, 3:15 PM PDT"

console.log(new Intl.DateTimeFormat('en-US', options).format(event));
// "Wed, March 14, 3:15 PM PDT"
11
mark

Ceci est très proche d'être hors sujet car basé sur l'opinion, mais c'est quand même le cas.

Laquelle de celles-ci dois-je utiliser?

Date.prototype.toLocaleString était à l'origine uniquement dépendant de l'implémentation et variait un peu selon les navigateurs. Lorsque la prise en charge de l'objet Intl a été ajoutée (ECMAScript 2015, ed 6), toLocaleString a été autorisé à prendre en charge les mêmes options. Bien que le support ne soit pas mandaté par ECMA-262, toutes les implémentations actuelles le supportent probablement.

Notez que cela n'a pas supprimé la variabilité d'implémentation autorisée, il a simplement fourni des options de formatage basées sur la langue, la région et le dialecte (ainsi que des options de fuseau horaire basées sur les identificateurs IANA time zone database et valeurs).

L'objet Intl (et donc toLocaleString) est basé sur ECMA-402 , qui ne spécifie pas strictement le formatage, donc il y a encore de la place pour que les implémentations diffèrent. Les plus grandes différences concernent les noms de fuseaux horaires (pour lesquels il n'y a pas de norme) et le placement des virgules, des espaces, etc.

Cependant, pour la plupart des raisons pratiques, que vous utilisiez l'objet Intl ou toLocaleString dépend de vous, je ne pense pas qu'il y ait de raison technique de préférer l'un à l'autre. Alors que les résultats pour les deux doivent être identiques pour une implémentation particulière, ne vous attendez pas à ce que la chaîne résultante soit exactement identique entre les implémentations ou conforme à une particulière format pour un BCP 47 language tag .

8
RobG

Outre les points que d'autres ont émis, j'ai vu une différence avec formats par défaut (options) :

const event = new Date(1521065710000);

//const options = ...

console.log(event.toLocaleString('en-US' /*, options*/));
// "3/15/2018, 1:45:10 AM"

console.log(new Intl.DateTimeFormat('en-US' /*, options*/).format(event));
// "3/15/2018"

Testé par rapport à Chrome v72.

2
Mir-Ismaili

L'API d'internationalisation n'est pas prise en charge dans tous les navigateurs pour l'instant - notamment IE10 et versions inférieures et UC Browser pour Android 11.8. Si vous souhaitez prendre en charge ces navigateurs, utilisez ToLocaleString. (Bien que si l'API d'internationalisation n'est pas prise en charge, ce que renvoie ToLocalString dépend de l'implémentation.)

Intl.DateTimeFormat.prototype.format est conçu pour l'utilisation de la mise en forme de grands groupes de dates - plutôt que de définir les paramètres régionaux et les options à chaque fois, vous les définissez une fois et utilisez la fonction de format résultante à partir de là.

2
Sora2455