Moment.js - завтра, сьогодні та вчора


115

Мені б хотілося moment().fromNow()функціоналу, але коли дата закінчується, вона занадто точна - колишня. Я не хочу, щоб це показувало "через 3 години", але "сьогодні" - так в основному з "щоденною" точністю.

Я спробував скористатися moment().calendar()функцією, вона не форматується, якщо різниця дат перевищує 1 день

Відповіді:


119

Ви також можете зробити це, щоб отримати дату на сьогодні і завтра та вчора

let today     = moment();

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

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

цього немає в офіційних api! Будь ласка, надайте для вас полифункцію
Халед Аль-Ансарі

дивіться документи тут momentjs.com/docs/#/manipulating/add Єдине, що я додаю, - це new Date()уникати попередження, яке вказує мені ліб (див. momentjs.com/docs/#/parsing/now )
HussienK

8
вибачте за голосування проти, але я не просив цього. Я здивований, що це найвища відповідь (на момент написання) ...
Ziarno

8
Це правда, я дійсно додав це як орієнтир для себе та інших, хто може закінчитися тут через те, як формулюється назва питання. Схоже, це допомагало багатьом людям, від чого я задоволений. :)
HussienK

2
Чи new Date()потрібне? Я думав, moment()генерував примірник моменту, використовуючи сьогоднішню дату в будь-якому випадку
Крейг Майлз

37

Ви можете налаштувати спосіб відображення дат .fromNowі .calendarметодів, і методів moment.updateLocale. Наступний код змінить спосіб .calendarвідображення відповідно до питання:

moment.updateLocale('en', {
    calendar : {
        lastDay : '[Yesterday]',
        sameDay : '[Today]',
        nextDay : '[Tomorrow]',
        lastWeek : '[Last] dddd',
        nextWeek : '[Next] dddd',
        sameElse : 'L'
    }
});

Виходячи з питання, здається, що .calendarметод був би більш підходящим - .fromNowхоче мати попередній / теперішній префікс / суфікс, але якщо ви хочете дізнатися більше, можете прочитати документацію на веб- сайті http://momentjs.com / docs / # / налаштування / відносний час / .

Щоб використовувати це лише в одному місці замість того, щоб перезаписувати локалі, передайте рядок на ваш вибір як перший аргумент, коли ви визначаєте, moment.updateLocaleа потім викликаєте метод календаря, використовуючи цю локаль (наприклад, moment.updateLocale('yesterday-today').calendar( /* moment() or whatever */ ))

EDIT:updateLocale Метод ^ 2.12.0 тепер має метод. updateLocaleі, localeздається, функціонально однакові і localeще не застаріли, але оновили відповідь, щоб використовувати новіший метод.


1
це змінює глобальну локалізацію, мені просто потрібно це на 1 місці :)
Ziarno

Дивіться редагування - ви можете створити власні локалі замість перезапису існуючих
локалів

35

Я використовую комбінацію add()і endOf()з моментом

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

21

Вимоги:

  • Коли дата проходить далі, використовуйте стандартну moment().fromNow()функціональність.
  • Коли дата ближче, шоу "today", "yesterday", "tomorrow"і т.д.

Рішення:

// 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 + "]";
        }
    });
}

Примітка. З версії 2.14.0 аргумент форматів до функції календаря може бути зворотним дзвінком, див. Http://momentjs.com/docs/#/displaying/calendar-time/ .



11

У мене є подібне рішення, але дозволяє використовувати локалі:

    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'

він працює, але якщо змінити '> = 1' для '> = 2', ви отримаєте рядок "вчора" замість "1 день тому".
Доді

10

З 2.10.5 моменту підтримується вказівка ​​форматів календаря для виклику. Для більш детальної документації перевірте Момент - Календар .

**Moment 2.10.5**
moment().calendar(null, {
  sameDay: '[Today]',
  nextDay: '[Tomorrow]',
  nextWeek: 'dddd',
  lastDay: '[Yesterday]',
  lastWeek: '[Last] dddd',
  sameElse: 'DD/MM/YYYY'
});

З календаря 2.14.0 також можна приймати зворотний дзвінок для повернення значень.

**Moment 2.14.0**
    moment().calendar(null, {
     sameDay: function (now) {
       if (this.isBefore(now)) {
         return '[Will Happen Today]';
       } else {
        return '[Happened Today]';
       }
       /* ... */
      }
    });

чому низовини? Дай мені знати , так що я можу поліпшити цей анс
Pravin

Це відповідь.
oscarteg

це правильна відповідь, я думаю. Але вона все ще не повертає результат типу "3 дні тому", якщо не буде налаштовано
Zortext

9

У Moment.js метод from () має щоденну точність, яку ви шукаєте:

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"

2
дякую, але він все ще не відображає "сьогодні", а відображає колишнє. "1 день тому" замість "вчора" - виглядає як функціонал, який мені потрібно
налаштувати

1
fromнасправді не має щоденної точності. Наприклад, якщо вчора було чотири години тому, і я вибрав час, який був п'ять годин тому, замість вчорашнього дня він буде говорити "5 годин тому". Це рішення не має нічого спільного з точністю from, але дати пройшли в.
Майкл MIOR

5

Так це я і закінчила

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];
}

У мене така ж проблема, але мені потрібно застосувати i18n, і в мене є 10 мов ... тому я покладався на момент інтернаціоналізації JS ...
Chexpir

3

Ви можете скористатися методом .add () та .subtract (), щоб отримати вчорашні та завтрашні дати. Тоді використовуйте метод формату, щоб отримати лише дату .format ("D / M / Y"), D - це день, M - місяць, Y - рік. Заїзд у Документи Моменту

 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");

Результатом буде:

Current Milli - 1576693800000
today - 19/12/2019
tomorrow - 18/12/2019
yesterday - 18/12/2019

3

Ось як я це роблю, використовуючи момент :

  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();

1
const date = moment(YOUR_DATE)
return (moment().diff(date, 'days') >= 2) ? date.fromNow() : date.calendar().split(' ')[0]
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.