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

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

Я пытаюсь с moment.js знать, есть ли дата сегодня, вчера, 1 неделя назад или старше (2 недели назад или более).

Я уже сделал это для первых двух случаев:

var today = moment().startOf('day');
var yesterday = moment().subtract(1, 'days').startOf('day');

if (moment(localTime).isSame(today, 'd')) // today
    // do something
if (moment(localTime).isSame(yesterday, 'd')) // yesterday
    // do something

Правильно ли это?

Однако, как я могу проверить, есть ли дата неделю назад или старше (например, две недели назад)?

4b9b3361

Ответ 1

Здесь что-то полезное:

var REFERENCE = moment("2015-06-05"); // fixed just for testing, use moment();
var TODAY = REFERENCE.clone().startOf('day');
var YESTERDAY = REFERENCE.clone().subtract(1, 'days').startOf('day');
var A_WEEK_OLD = REFERENCE.clone().subtract(7, 'days').startOf('day');

function isToday(momentDate) {
    return momentDate.isSame(TODAY, 'd');
}
function isYesterday(momentDate) {
    return momentDate.isSame(YESTERDAY, 'd');
}
function isWithinAWeek(momentDate) {
    return momentDate.isAfter(A_WEEK_OLD);
}
function isTwoWeeksOrMore(momentDate) {
    return !isWithinAWeek(momentDate);
}

console.log("is it today? ..................Should be true: "+isToday(moment("2015-06-05")));
console.log("is it yesterday? ..............Should be true: "+isYesterday(moment("2015-06-04")));
console.log("is it within a week? ..........Should be true: "+isWithinAWeek(moment("2015-06-03")));
console.log("is it within a week? ..........Should be false: "+isWithinAWeek(moment("2015-05-29")));
console.log("is it two weeks older or more? Should be false: "+isTwoWeeksOrMore(moment("2015-05-30")));
console.log("is it two weeks older or more? Should be true: "+isTwoWeeksOrMore(moment("2015-05-29")));

Проверьте JSFiddle demo с большим количеством тестов, поэтому при необходимости можете настроить ваш конкретный случай.

Ответ 2

Более точный ответ следующим образом

var today = moment();
var yesterday = moment().subtract(1, 'day');

var engagementDate = (Date to be compare);

if(moment(engagementDate).isSame(today, 'day'))
  console.log('Today');
else if(moment(engagementDate).isSame(yesterday, 'day'))
  console.log('Yesterday');

Ответ 3

Функция diff может быть полезна для вашего случая и, в общем, проверять точные дни с даты

var sampleDaysAgo = moment().subtract(28, 'days'); //28 just for test
var today = moment();

console.log(today.diff(sampleDaysAgo, 'days')); // 28 

Демо

Ответ 4

Момент уже содержит некоторую логику такого рода

Вы можете посмотреть исходный код для кода humanize https://github.com/moment/moment/blob/ed1fc742b179708d0a987a639979178616309f93/src/lib/duration/humanize.js

и логика fromNow

https://github.com/moment/moment/blob/497f918515ae6ab900f008f19523b1e4ae5e2450/src/lib/moment/from.js

Мне посчастливилось узнать, как они это сделали.

Способ форматирования строки будет зависеть от вашего бизнеса, и, честно говоря, встроенная логика, вероятно, не будет сокращать ее большую часть времени. Кажется, что смысл даты "сообщения", где "несколько дней назад" в порядке, но я отслеживаю пакеты по почте и говорю "Ваш пакет, отправленный несколько дней назад", просто недостаточно.

Ответ 5

Начиная с версии 2.14, вы можете настроить функцию calendar()

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

Это предназначено для событий типа "календарь".

http://momentjs.com/docs/#/displaying/calendar-time/