Подтвердить что ты не робот

Moment.js - завтра, сегодня и вчера

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

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

4b9b3361

Ответ 1

Вы также можете сделать это, чтобы получить дату сегодня, завтра и вчера.

let today     = moment(new Date());

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

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

Ответ 2

Вы можете настроить способ отображения датами .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/#/customization/relative-time/.

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

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

Ответ 3

Я использую комбинацию 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'
//...

Ответ 4

У меня есть аналогичное решение, но позволяет использовать локали:

    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'

Ответ 5

Требования:

  • Когда дата еще дальше, используйте стандартную функцию 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 + "]";
        }
    });
}

NB. Начиная с версии 2.14.0, аргумент форматов для функции календаря может быть обратным вызовом, см. Http://momentjs.com/docs/#/displaying/calendar-time/.

Ответ 6

В 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"

Ответ 7

От 2.10.5 момента поддерживает указание форматов выходных данных календаря на вызов Для более подробной документации проверьте Moment - Календарь.

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

Ответ 8

Итак, это то, что я закончил делать

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

Ответ 9

Вы можете использовать это:


const today     = moment();

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

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