Moment.js - demain, aujourd'hui et hier

116

J'aimerais la moment().fromNow()fonctionnalité, mais quand la date est proche, elle est trop précise - ex. Je ne veux pas que ça montre «dans 3 heures» mais «aujourd'hui» - donc fondamentalement avec une précision «quotidienne».

J'ai essayé d'utiliser la moment().calendar()fonction, elle ne se formate pas si la différence de date est supérieure à 1 jour

Ziarno
la source

Réponses:

120

Vous pouvez également le faire pour obtenir la date d'aujourd'hui, de demain et d'hier

let today     = moment();

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

let yesterday = moment().add(-1, 'days');
HussienK
la source
ce n'est pas dans l'API officielle! veuillez fournir le polyfill que vous avez pour cela
Khaled Al-Ansari
voir la documentation ici momentjs.com/docs/#/manipulating/add La seule chose que j'ajoute est le new Date()pour éviter un avertissement que la lib ne cesse de me donner (voir momentjs.com/docs/#/parsing/now )
HussienK
8
désolé pour le vote négatif, mais ce n’est pas ce que j’ai demandé. Je suis surpris que ce soit la réponse la plus votée (au moment de la rédaction) ...
Ziarno
8
C'est vrai, je l'ai vraiment ajouté comme référence pour moi et pour les autres qui pourraient finir ici à cause de la façon dont le titre de la question est formulé. On dirait que cela a aidé beaucoup de gens, ce dont je suis heureux. :)
HussienK
2
Est-ce new Date()nécessaire? Je pensais avoir moment()généré une instance de moment en utilisant la date d'aujourd'hui de toute façon
Craig Myles
37

Vous pouvez personnaliser la façon dont .fromNowles .calendarméthodes et affichent les dates à l'aide de moment.updateLocale. Le code suivant changera la façon dont .calendars'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 .calendarméthode serait plus appropriée - .fromNowveut avoir un préfixe / suffixe passé / présent, mais si vous souhaitez en savoir plus, vous pouvez lire la documentation sur http://momentjs.com / docs / # / personnalisation / relative-time / .

Pour utiliser cela à un seul endroit au lieu d'écraser les paramètres régionaux, passez une chaîne de votre choix comme premier argument lorsque vous définissez le moment.updateLocale, puis invoquez la méthode de calendrier en utilisant ces paramètres régionaux (par exemple moment.updateLocale('yesterday-today').calendar( /* moment() or whatever */ )) .

EDIT: Moment ^ 2.12.0 a maintenant la updateLocaleméthode. updateLocaleetlocale semblent être fonctionnellement identiques, et localen'est pas encore obsolète, mais a mis à jour la réponse pour utiliser la nouvelle méthode.

Svangordon
la source
1
cela change la localisation globale, j'ai juste besoin de ceci en 1 endroit :)
Ziarno
Voir modifier - vous pouvez créer des paramètres régionaux personnalisés au lieu d'écraser les paramètres régionaux existants
svangordon
35

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'
//...
guillaumepotier
la source
21

Exigences:

  • Lorsque la date est plus éloignée, utilisez la moment().fromNow()fonctionnalité standard .
  • Lorsque la date est plus proche, spectacle "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: A partir de la version 2.14.0, l'argument formats de la fonction calendrier peut être un callback, voir http://momentjs.com/docs/#/displaying/calendar-time/ .

Ben
la source
19

Vous pouvez utiliser ceci:


const today     = moment();

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

const yesterday = moment().subtract(1, 'days');
Alexandr Egorov
la source
11

J'ai une solution similaire, mais permet d'utiliser des locales:

    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'
Adara Hv
la source
cela fonctionne, mais si vous remplacez «> = 1» par «> = 2», vous obtiendrez la chaîne «hier» au lieu de «il y a 1 jour».
Dody
10

À partir de la version 2.10.5, le moment prend en charge la spécification des formats de sortie du calendrier par appel. Pour une documentation plus détaillée, consultez Moment - Calendar .

**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]';
       }
       /* ... */
      }
    });
Pravin
la source
pourquoi les votes négatifs? Faites-moi savoir afin que je puisse améliorer ce ans
pravin
Ceci est la réponse.
oscarteg
c'est la bonne réponse je pense. Mais il ne renvoie toujours pas de résultat de type "il y a 3 jours" à moins d'être hautement personnalisé
Zortext
9

Dans Moment.js, la méthode from () a la précision quotidienne que vous recherchez:

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"
Twernt
la source
2
merci, mais il n'affiche toujours pas «aujourd'hui» et affiche ex. 'Il y a 1 jour' au lieu de 'hier' - il semble que la fonctionnalité dont j'ai besoin doit être personnalisée
Ziarno
1
fromn'a pas vraiment de précision quotidienne. Par exemple, si hier était il y a quatre heures et que je choisis une heure qui était il y a cinq heures, il indiquera "il y a 5 heures" au lieu d'hier. Cette solution n'a rien à voir avec la précision de from, mais avec les dates passées.
Michael Mior
5

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];
}
Ziarno
la source
J'ai le même problème, mais j'ai besoin d'appliquer i18n, et j'ai 10 langues ... donc je comptais sur le momentJS internationalisation ...
Chexpir
3

Vous pouvez utiliser les méthodes .add () et .subtract () pour obtenir la date d'hier et de demain. Ensuite, utilisez la méthode de format pour obtenir uniquement la date .format ("J / M / A"), D pour Jour, M pour Mois, Y pour Année. Archiver les documents Moment

 let currentMilli = Date.now()
 let today = Moment(currentMilli).format("D/M/Y");
 let tomorrow = Moment(currentMilli).add(1, 'days').format("D/M/Y");
 let yesterday = Moment(currentMilli).subtract(1, 'days').format("D/M/Y");

Le résultat sera:

Current Milli - 1576693800000
today - 19/12/2019
tomorrow - 18/12/2019
yesterday - 18/12/2019
Ashutosh
la source
3

Voici comment je fais cela en utilisant moment :

  let today = moment().format('DD MMMM YYYY');

  let tomorrow = moment().add(1, 'days').format('DD MMMM YYYY').toString();

  let yesterday = moment().subtract(1, 'days').startOf('day').format('DD MMMM YYYY').toString();
Iffat
la source
1
const date = moment(YOUR_DATE)
return (moment().diff(date, 'days') >= 2) ? date.fromNow() : date.calendar().split(' ')[0]
Dody
la source