moment().fromNow() renvoie "il y a quelques secondes".
Pourquoi pas "juste maintenant" ?
Vous pouvez personnaliser cela en faisant quelque chose comme moment.langData('en').relativeTime.s = "just now"
, bien que cela semblerait étrange avec un suffixe.
Si vous le souhaitez, vous pouvez créer une méthode qui enveloppe fromNow
.
moment.fn.fromNowOrNow = function (a) {
if (Math.abs(moment().diff(this)) < 1000) { // 1000 milliseconds
return 'just now';
}
return this.fromNow(a);
}
Merci Tim !
Merci pour le code. Je suis d'accord avec "il y a quelques secondes", mais j'obtiens souvent aussi "en quelques secondes" après avoir terminé une opération car les horloges du serveur et du client ne sont pas synchronisées. Alors je me demande si ça n'aurait pas de sens d'afficher "juste maintenant" dans les deux cas ?
Oui, le code ci-dessus indique "just now" si c'est 1 seconde avant ou après l'heure actuelle, donc si vous souhaitez augmenter cette plage, vous pouvez simplement modifier le nombre de millisecondes.
moment.fn.fromNowOrNow = function (a) {
if (Math.abs(moment().diff(this)) < 25000) { // 25 seconds before or after now
return 'just now';
}
return this.fromNow(a);
}
Merci, j'ai compris, mais je me demandais s'il serait logique que "tout à l'heure" soit le comportement par défaut, étant donné que voir "en quelques secondes" pour un événement passé ressemble à un bogue pour la plupart des utilisateurs.
+1 pour "tout à l'heure" comme comportement par défaut !
Eh bien, si vos horloges ne sont pas synchronisées, vous avez un problème. Je ne pense pas que le bon endroit pour le réparer soit la méthode d'humanisation du moment. C'est une bibliothèque de temps, vous lui dites d'afficher une heure dans le futur, et il le fait.
Si vous voulez changer la chaîne "il y a quelques secondes" par "tout à l'heure", mais laisser "dans quelques secondes", c'est une autre chose. Cela nécessitera également un correctif de toutes les traductions ;-)
moment.langData('fr').relativeTime.s = "jamais"; était la correction pour mon problème # 555
Merci Tim !
Les horloges seront presque toujours un peu désynchronisées lors de l'analyse des horodatages générés par le serveur dans un navigateur. Est-ce un cas d'utilisation rare pour moment.js ?
Je pense que l'ajout d'une valeur epsilon de quelques secondes, de sorte que des intervalles plus petits que cela dans n'importe quelle direction produiraient "juste maintenant" ou similaire, et si cette valeur est facilement modifiable, elle peut répondre aux attentes de tout le monde - la valeur 0 signifie le comportement actuel , une valeur supérieure à zéro sert à lutter contre le décalage navigateur/serveur ou similaire.
Qu'est-ce que tu penses?
Une "valeur epsilon" configurable semble être une bonne idée.
Je pense qu'une solution plus simple au problème de @ejain consiste à
var now = moment();
var mom = momentFromServer < now ? now : momentFromServer;
mom.fromNow(); //=> a few seconds ago
Si cela doit faire partie de Moment, ma suggestion est simplement d'en faire un argument booléen à fromNow()
. Ou mieux encore, laissez fromNow prendre un objet option (compatible inversement), comme fromNow({withSuffix: false, forcePast: true})
.
@icambron : excellente solution, si vous pouvez être sûr de ne pas avoir de moments futurs valables.
@timrwood merci pour vos conseils
c'est en fait moment.langData('en')._relativeTime.s = "just now"
si vous voulez remplacer cette chaîne.
J'humanise les dates (sans information sur l'heure), donc changer _relativeTime.s en l'équivalent de "aujourd'hui" pour tous les paramètres régionaux était ma solution.
fromNow(true) renvoie "il y a 2 minutes", "il y a 2 heures", "il y a quelques secondes".
Comment pouvez-vous faire quelque chose comme "2m" ou "2h" ou "2s" ou "2d" ?.
@puneet94 Vous pouvez mettre à jour vos chaînes de paramètres régionaux avec https://momentjs.com/docs/#/customization/relative -time/
FWIW, j'ai pu appliquer "just now" en utilisant 2.12.0 en spécifiant une fonction pour past
:
moment.updateLocale('en', {
relativeTime : {
past: function(input) {
return input === 'just now'
? input
: input + ' ago'
},
s : 'just now',
future: "in %s",
ss : '%d seconds',
m: "a minute",
mm: "%d minutes",
h: "an hour",
hh: "%d hours",
d: "a day",
dd: "%d days",
M: "a month",
MM: "%d months",
y: "a year",
yy: "%d years"
}
});
@richardszalay quel format de date utilisez-vous avec cela et comment l'appliquez-vous ?
J'ai une chaîne de date time = 1560955417474,
et souhaitez l'afficher dans une balise de texte
<Text>{time}</Text>
Commentaire le plus utile
Vous pouvez personnaliser cela en faisant quelque chose comme
moment.langData('en').relativeTime.s = "just now"
, bien que cela semblerait étrange avec un suffixe.Si vous le souhaitez, vous pouvez créer une méthode qui enveloppe
fromNow
.