web-dev-qa-db-fra.com

Moment.js - demain, aujourd'hui et hier

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

81
Ziarno

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');
84
HussienK

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.

30
svangordon

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'
//...
27
guillaumepotier

Vous pouvez utiliser ceci:


const today     = moment();

const tomorrow  = moment().add(1, 'days');

const yesterday = moment().subtract(1, 'days');

13
Alexandr Egorov

Conditions requises:

  • Lorsque la date est éloignée, utilisez la fonctionnalité standard moment().fromNow().
  • Lorsque la date est proche, affichez "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/ .

11
Ben

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'
11
Adara Hv

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"
10
twernt

À 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]';
       }
       /* ... */
      }
    });
5
pravin

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];
}
4
Ziarno
const date = moment(YOUR_DATE)
return (moment().diff(date, 'days') >= 2) ? date.fromNow() : date.calendar().split(' ')[0]
1
Dody