Je voudrais la fonctionnalité moment().fromNow()
, mais quand la date est proche, elle est trop précise - ex. Je ne veux pas que cela apparaisse "en 3 heures" mais "aujourd'hui" - donc en gros avec une précision "quotidienne".
J'ai essayé d'utiliser la fonction moment().calendar()
, elle ne formate pas si la différence de date est supérieure à 1 jour
Vous pouvez également le faire pour obtenir la date d'aujourd'hui et de demain et hier.
let today = moment(new Date());
let tomorrow = moment(new Date()).add(1,'days');
let yesterday = moment(new Date()).add(-1, 'days');
Vous pouvez personnaliser la manière dont les méthodes .fromNow
et .calendar
affichent les dates à l'aide de moment.updateLocale
. Le code suivant va changer la façon dont .calendar
s'affiche selon la question:
moment.updateLocale('en', {
calendar : {
lastDay : '[Yesterday]',
sameDay : '[Today]',
nextDay : '[Tomorrow]',
lastWeek : '[Last] dddd',
nextWeek : '[Next] dddd',
sameElse : 'L'
}
});
Sur la base de la question, il semble que la méthode .calendar
serait plus appropriée - .fromNow
veut avoir un préfixe/suffixe passé/présent, mais si vous voulez en savoir plus, vous pouvez le lire. la documentation sur http://momentjs.com/docs/#/customization/relative- time/ .
Pour utiliser ceci dans un seul endroit au lieu de remplacer les paramètres régionaux, transmettez une chaîne de votre choix comme premier argument lorsque vous définissez le moment.updateLocale
, puis appelez la méthode calendar à l'aide de ces paramètres régionaux (par exemple, moment.updateLocale('yesterday-today').calendar( /* moment() or whatever */ )
).
EDIT: Moment ^ 2.12.0 a maintenant la méthode updateLocale
. updateLocale
et locale
semblent fonctionnellement identiques, et locale
n'est pas encore obsolète, mais a mis à jour la réponse pour utiliser la méthode la plus récente.
J'utilise une combinaison de add()
et endOf()
avec moment
//...
const today = moment().endOf('day')
const tomorrow = moment().add(1, 'day').endOf('day')
if (date < today) return 'today'
if (date < tomorrow) return 'tomorrow'
return 'later'
//...
Vous pouvez utiliser ceci:
const today = moment();
const tomorrow = moment().add(1, 'days');
const yesterday = moment().subtract(1, 'days');
Conditions requises:
moment().fromNow()
."today"
, "yesterday"
, "tomorrow"
, etc.Solution:
// call this function, passing-in your date
function dateToFromNowDaily( myDate ) {
// get from-now for this date
var fromNow = moment( myDate ).fromNow();
// ensure the date is displayed with today and yesterday
return moment( myDate ).calendar( null, {
// when the date is closer, specify custom values
lastWeek: '[Last] dddd',
lastDay: '[Yesterday]',
sameDay: '[Today]',
nextDay: '[Tomorrow]',
nextWeek: 'dddd',
// when the date is further away, use from-now functionality
sameElse: function () {
return "[" + fromNow + "]";
}
});
}
NB: À partir de la version 2.14.0, l’argument formats de la fonction calendrier peut être un rappel, voir http://momentjs.com/docs/#/displaying/calendar-time/ .
J'ai une solution similaire, mais permet d'utiliser des paramètres régionaux:
let date = moment(someDate);
if (moment().diff(date, 'days') >= 1) {
return date.fromNow(); // '2 days ago' etc.
}
return date.calendar().split(' ')[0]; // 'Today', 'yesterday', 'tomorrow'
Dans Moment.js, la méthode from () présente la précision quotidienne recherchée:
var today = new Date();
var tomorrow = new Date();
var yesterday = new Date();
tomorrow.setDate(today.getDate()+1);
yesterday.setDate(today.getDate()-1);
moment(today).from(moment(yesterday)); // "in a day"
moment(today).from(moment(tomorrow)); // "a day ago"
moment(yesterday).from(moment(tomorrow)); // "2 days ago"
moment(tomorrow).from(moment(yesterday)); // "in 2 days"
À partir de la version 2.10.5, il est possible de spécifier des formats de sortie de calendrier par appel. Pour une vérification plus détaillée de la documentation, Moment - Calendrier .
**Moment 2.10.5**
moment().calendar(null, {
sameDay: '[Today]',
nextDay: '[Tomorrow]',
nextWeek: 'dddd',
lastDay: '[Yesterday]',
lastWeek: '[Last] dddd',
sameElse: 'DD/MM/YYYY'
});
À partir de la version 2.14.0, le calendrier peut également prendre un rappel pour renvoyer des valeurs.
**Moment 2.14.0**
moment().calendar(null, {
sameDay: function (now) {
if (this.isBefore(now)) {
return '[Will Happen Today]';
} else {
return '[Happened Today]';
}
/* ... */
}
});
Alors c'est ce que j'ai fini par faire
var dateText = moment(someDate).from(new Date());
var startOfToday = moment().startOf('day');
var startOfDate = moment(someDate).startOf('day');
var daysDiff = startOfDate.diff(startOfToday, 'days');
var days = {
'0': 'today',
'-1': 'yesterday',
'1': 'tomorrow'
};
if (Math.abs(daysDiff) <= 1) {
dateText = days[daysDiff];
}
const date = moment(YOUR_DATE)
return (moment().diff(date, 'days') >= 2) ? date.fromNow() : date.calendar().split(' ')[0]