Mise à jour 4 avril 2021:
J'ai converti le code ci-dessous en un package node. Voici le dépôt.
[✔] (Déc. 18) une proposition de stade 3, et déjà implémentée dans Chrome 71
[✔] (Oct. 20) au stade 4 (terminé), et prêt pour inclusion dans la norme ECMAScript formelle
// en millisecondes
var units = {
year : 24 * 60 * 60 * 1000 * 365,
month : 24 * 60 * 60 * 1000 * 365/12,
day : 24 * 60 * 60 * 1000,
hour : 60 * 60 * 1000,
minute: 60 * 1000,
second: 1000
}
var rtf = new Intl.RelativeTimeFormat('en', { numeric: 'auto' })
var getRelativeTime = (d1, d2 = new Date()) => {
var elapsed = d1 - d2
// "Math.abs" tient compte des scénarios "passé" et "futur"
for (var u in units)
if (Math.abs(elapsed) > units[u] || u == 'second')
return rtf.format(Math.round(elapsed/units[u]), u)
}
// liste de test de dates à comparer avec la date actuelle
[
'20/10/1984',
'20/10/2015',
+new Date() - units.year,
+new Date() - units.month,
+new Date() - units.day,
+new Date() - units.hour,
+new Date() - units.minute,
+new Date() + units.minute*2,
+new Date() + units.day*7,
]
.forEach(d => console.log(
new Date(d).toLocaleDateString(),
new Date(d).toLocaleTimeString(),
'(Relatif à maintenant) →',
getRelativeTime(+new Date(d))
))
Intl.RelativeTimeFormat est disponible par défaut dans V8 v7.1.179 et Chrome 71. À mesure que cette API devient de plus en plus disponible, vous trouverez des bibliothèques telles que Moment.js, Globalize et date-fns abandonnant leur dépendance aux bases de données CLDR codées en dur au profit de la fonctionnalité native de formatage des temps relatifs, améliorant ainsi les performances de chargement, les performances d'analyse et de compilation, les performances d'exécution et l'utilisation de la mémoire.
0 votes
Vérifiez ceci - formatjs.io/docs/polyfills/intl-relativetimeformat