Moment JS-检查日期是今天还是将来


222

我正在尝试momentjs检查给定的日期是今天还是将来。

这是我到目前为止的内容:

<script type="text/javascript" src="http://momentjs.com/downloads/moment.min.js"></script>
<script type="text/javascript">

var SpecialToDate = '31/01/2014'; // DD/MM/YYYY

var SpecialTo = moment(SpecialToDate, "DD/MM/YYYY");
if (moment().diff(SpecialTo) > 0) {
    alert('date is today or in future');
} else {
    alert('date is in the past');
}

</script>

代码会将我的日期(2014年1月31日)评估为过去的日期。

知道我在做什么错吗?

Answers:


197

阅读文档之后:http : //momentjs.com/docs/#/displaying/difference/,您必须diff像减号运算符一样考虑该函数。

                   // today < future (31/01/2014)
today.diff(future) // today - future < 0
future.diff(today) // future - today > 0

因此,您必须扭转状况。

如果要检查一切正常,可以向该函数添加一个额外的参数:

moment().diff(SpecialTo, 'days') // -8 (days)

75
如果是不同的一天,这将行不通,但相差不到24小时
galki's

1
工作,无论时差小于24小时。
zanderwar '16

3
不为我工作。如果日在将来的那一刻成为+1()。diff(SpecialTo,'days')给我-0(负零)
gavroche

2
今天并不意味着接下来的24小时。isSame是很好的解决方案。
卡巴斯尔

1
moment().diff(SpecialToDate)直接以毫秒为单位。'days'不需要。这将适用于所有情况。SpecialToDate可以'2018-10-26 00:00:00'作为示例。
反斜杠

312

您可以使用以下isSame功能:

var iscurrentDate = startTime.isSame(new Date(), "day");
if(iscurrentDate) {

}

这个年月也都匹配吗?
SuperUberDuper

13
必须与年份和月份匹配。moment('2010-01-01')。isSame('2011-01-01','month'); //错误,不同的年份('2010-01-01')。isSame('2010-02-01','day'); //错误的月份,不同的月份
Gray Wolf

6
这甚至没有回答OP的问题……“今天还是未来”,这是startTime什么?日期对象没有isSame方法...
Sharcoux

1
@Sharcoux这个问题是关于moment.js的,所以很明显它是一个矩对象。
弥敦道

157
// Returns true if it is today or false if it's not
moment(SpecialToDate).isSame(moment(), 'day');

85

由于似乎还没有人提及它,因此检查Moment日期对象是否为过去的最简单方法是:

momentObj.isBefore()

或将来:

momentObj.isAfter()

只需将args留空-默认为现在。

还有isSameOrAfterisSameOrBefore

注意,这是时间因素。如果您只关心一天,请参阅Dipendu的答案


1
文档解释说这是未定义的行为,因此您不应该这样做:momentjs.com/docs
#/query

13
@Dancrumb再次阅读。“如果未将任何内容传递给moment#isBefore,它将默认为当前时间。” 将momentObj在我的例子是一个时刻日期的实例。文档专门讨论创建一个新实例(当前时间),然后在一条语句中检查它是否过去。我并不是在建议您这样做moment().isBefore()完全没有意义-为什么您要检查现在是否过去(或将来)?
mpen

83

您可以使用isAfter()momentjs 的查询功能:

检查片刻之后是否还有片刻。

moment('2010-10-20').isAfter('2010-10-19'); // true

如果要将粒度限制为毫秒以外的单位,请将单位作为第二个参数传递。

moment('2010-10-20').isAfter('2010-01-01', 'year'); // false

moment('2010-10-20').isAfter('2009-12-31', 'year'); // true

http://momentjs.com/docs/#/query/is-after/


不建议使用带日期字符串的构造函数。
Vahid Amiri

@VahidAmiri 文档未提及此内容。但是他们确实建议如果我们不使用ISO 8601,我们使用字符串+格式构造器。因此,除非使用某种奇怪的日期格式,否则仅使用字符串即可。
johndodo

15

反转isBefore方法,以检查日期是否与今天或将来相同,如下所示:

!moment(yourDate).isBefore(moment(), "day");

10

以防万一其他人需要这样做,请执行以下操作:

const isToday = moment(0, "HH").diff(date, "days") == 0;

或者如果您想要一个功能:

isToday = date => moment(0,"HH").diff(date, "days") == 0;

日期是要检查的日期。

说明

moment(0, "HH") 返回今天的午夜。

date1.diff(date2, "days") 返回date1和date2之间的天数。

更新资料

此后,我发现了isSame函数,我相信它是用于确定日期是否为今天的正确函数:

moment().isSame('2010-02-01', 'day'); // Return true if we are the 2010-02-01

8

要检查今天是否是

如果我们比较两个还包含日期的日期,时间信息isSame显然将失败。diff如果两个日期跨越新的一天,则将失败:

var date1 = moment("01.01.2016 23:59:00", "DD.MM.YYYY HH.mm.ss");
var date2 = moment("02.01.2016 00:01:00", "DD.MM.YYYY HH.mm.ss");
var diff = date2.diff(date1); // 2seconds

我认为最好的方法如下:

var isSame = date1.date() == date2.date() && date1.month() == date2.month() && date1.year() == date2.year()

要检查是否将来

正如其他用户也建议的那样,该diff方法有效。

var isFuture = now.diff(anotherDate) < 0 

7

如果您只需要知道哪个更大,也可以直接比较它们:

var SpecialToDate = '31/01/2014'; // DD/MM/YYYY

var SpecialTo = moment(SpecialToDate, "DD/MM/YYYY");
if (moment() > SpecialTo) {
    alert('date is today or in future');
} else {
    alert('date is in the past');
}

希望这可以帮助!


4

如果firstDate相同或after(future)secondDate 返回true,否则返回false。Toda是firstDate = new Date();

  static isFirstDateSameOrAfterSecondDate(firstDate: Date, secondDate: Date): boolean {
    var date1 = moment(firstDate);
    var date2 = moment(secondDate);
    if(date1 && date2){
      return date1.isSameOrBefore(date2,'day');
    }
    return false;
  }

白天比较时刻的例子有isSame,isBefore和isAfter;

  static isFirstDateSameSecondDate(firstDate: Date, secondDate: Date): boolean {
    var date1 = moment(firstDate);
    var date2 = moment(secondDate);
    if (date1 && date2) {
      return date1.isSame(date2,'day');
    }
    return false;
  }

  static isFirstDateAfterSecondDate(firstDate: Date, secondDate: Date): boolean {
    var date1 = moment(firstDate);
    var date2 = moment(secondDate);
    if(date1 && date2){
      return date1.isAfter(date2,'day');
    }
    return false;
  }

  static isFirstDateBeforeSecondDate(firstDate: Date, secondDate: Date): boolean {
    var date1 = moment(firstDate);
    var date2 = moment(secondDate);
    if(date1 && date2){
      return date1.isBefore(date2,'day');
    }
    return false;
  }


2
function isTodayOrFuture(date){
  date = stripTime(date);
  return date.diff(stripTime(moment.now())) >= 0;
}

function stripTime(date){
  date = moment(date);
  date.hours(0);
  date.minutes(0);
  date.seconds(0);
  date.milliseconds(0);
  return date;
}

然后使用它在这行:

isTodayOrFuture(YOUR_TEST_DATE_HERE)

1

选择昨天以检查是否过去的日子 moment().subtract(1, "day");

参考:-http : //momentjs.com/docs/#/manipulating/subtract/

function myFunction() {
  var yesterday = moment().subtract(1, "day").format("YYYY-MM-DD");
  var SpecialToDate = document.getElementById("theDate").value;

  if (moment(SpecialToDate, "YYYY-MM-DD", true).isAfter(yesterday)) {
    alert("date is today or in future");
    console.log("date is today or in future");
  } else {
    alert("date is in the past");
    console.log("date is in the past");
  }
}
<script src="http://momentjs.com/downloads/moment.js"></script>
<input type="date" id="theDate" onchange="myFunction()">


1

如果我们想要没有时间的差异,则可以使用矩的格式,如下所示获得不同的日期(只有日期而没有时间)。

因为,我在做的时候面临着差异的问题;

moment().diff([YOUR DATE])

因此,提出了以下建议;

const dateValidate = moment(moment().format('YYYY-MM-DD')).diff(moment([YOUR SELECTED DATE HERE]).format('YYYY-MM-DD'))

IF dateValidate > 0 
   //it's past day
else
   //it's current or future

如果有任何需要改进的地方,请随时发表评论。

谢谢,


3
请查看如何写一个好的答案。不建议使用纯代码的答案,因为它们没有解释如何解决问题。您应该更新您的答案,以解释此问题的作用以及如何改善此问题已经存在的许多答案
FluffyKitten

0

我想要其他东西,但最终找到了一个可以尝试的技巧

somedate.calendar(compareDate, { sameDay: '[Today]'})=='Today'

var d = moment();
 var today = moment();
 
 console.log("Usign today's date, is Date is Today? ",d.calendar(today, {
    sameDay: '[Today]'})=='Today');
    
 var someRondomDate = moment("2012/07/13","YYYY/MM/DD");
 
 console.log("Usign Some Random Date, is Today ?",someRondomDate.calendar(today, {
    sameDay: '[Today]'})=='Today');
    
  
 var anotherRandomDate =  moment("2012/07/13","YYYY/MM/DD");
 
 console.log("Two Random Date are same date ? ",someRondomDate.calendar(anotherRandomDate, {
    sameDay: '[Today]'})=='Today');
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.18.1/moment.min.js"></script>


0

检查以下内容:

let isContinue = moment().diff('2020-04-04T20:06:11+05:30')/1000

它在几秒钟内返回。

如果将检查为2分钟状态,则

if (isContinue < 120) {
  ..To check otp details or further logic
} else {
   // otp is getting invalid
}

0

最简单的答案是:

const firstDate = moment('2020/10/14'); // the date to be checked
const secondDate = moment('2020/10/15'); // the date to be checked

firstDate.startOf('day').diff(secondDate.startOf('day'), 'days'); // result = -1
secondDate.startOf('day').diff(firstDate.startOf('day'), 'days'); // result = 1

它将检查午夜值,并返回准确的结果。当两个日期之间的时间差也小于24小时时,它也将起作用。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.