moment.js - 测试日期是今天、昨天、一周或两周前

moment.js - test if a date is today, yesterday, within a week or two weeks ago

我正在尝试使用 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

对吗?

但是,我如何检查日期是一周前还是更早(例如两周前)?

这里有一些有用的东西:

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

Check a JSFiddle demo 进行更多测试,因此您可以根据需要根据具体情况进行调整。

更准确的答案如下

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

diff 函数可能对您的情况有所帮助,并且通常可以检查某个日期后的确切天数

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

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

Demo

Moment 已经包含了一些这种性质的逻辑

您可能想查看 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

我发现这对了解他们是如何做到的很有用。

设置字符串格式的方式取决于您的业务,老实说,内置逻辑在大多数情况下可能无法解决问题。 'post' 的日期似乎有意义,其中 'a few days ago' 可以,但我正在跟踪邮件中的包裹并说 'Your package shipped a few days ago' 还不够好。

从 2.14 版本开始您可以自定义 calendar() 函数

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

这是为 'calendar' 类型的事件设计的。

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

今天最简单的解决方案:

const result = moment(date).isSame(moment(), "day")

昨天最简单的解决方案:

const result = moment(date).isSame(moment().subtract(1, 'day'), "day")