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

Posted

技术标签:

【中文标题】Moment JS - 检查日期是今天还是将来【英文标题】:Moment JS - check if a date is today or in the future 【发布时间】:2014-02-12 14:13:19 【问题描述】:

我正在尝试使用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 日)评估为过去的日期。

知道我做错了什么吗?

【问题讨论】:

【参考方案1】:

阅读文档后: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)

【讨论】:

如果是不同的日子但相差不到 24 小时,这将不起作用 工作,无论时差是否小于24小时。 不适合我。如果 day 在未来时刻为 +1().diff(SpecialTo, 'days') 给我 -0(负零) 今天并不意味着在接下来的 24 小时内。 isSame 是一个很好的解决方案。 moment().diff(SpecialToDate) 将直接给出以毫秒为单位的差异。 'days' 不需要。这适用于所有场景。例如,SpecialToDate 可以是'2018-10-26 00:00:00'【参考方案2】:

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

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

希望这会有所帮助!

【讨论】:

【参考方案3】:

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

检查一个时刻是否在另一个时刻之后。

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/

【讨论】:

不推荐使用日期字符串的构造函数。 @VahidAmiri docs 不提这个。但是,如果我们不使用ISO 8601,他们确实建议我们使用string + format 构造函数。因此,除非使用一些奇怪的日期格式,否则只使用字符串是可以的。【参考方案4】:

你可以使用isSame函数:

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


【讨论】:

这个也匹配年份和月份吗? 必须与年月相匹配。时刻('2010-01-01').isSame('2011-01-01', '月'); // false, 不同年份 moment('2010-01-01').isSame('2010-02-01', 'day'); // false,不同月份 这甚至不能回答 OP 的问题......“今天还是未来”,startTime 是什么?日期对象没有isSame 方法... @Sharcoux 这个问题是关于momentjs的,所以很明显它是一个moment对象。【参考方案5】:
// Returns true if it is today or false if it's not
moment(SpecialToDate).isSame(moment(), 'day');

【讨论】:

【参考方案6】:

使用最简单的方法检查未来日期

if(moment().diff(yourDate) >=  0)
     alert ("Past or current date");
else
     alert("It is a future date");

【讨论】:

【参考方案7】:

检查是否是今天

如果我们比较两个还包含时间信息的日期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 

【讨论】:

【参考方案8】:

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

【讨论】:

【参考方案9】:

如果 firstDate 相同或 after(future) secondDate 返回 true 否则返回 false。 Toda is 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;
  

【讨论】:

【参考方案10】:
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)

【讨论】:

【参考方案11】:

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

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

【讨论】:

【参考方案12】:

我想要它来做别的事情,但最终找到了一个你可以尝试的技巧

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');
&lt;script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.18.1/moment.min.js"&gt;&lt;/script&gt;

【讨论】:

【参考方案13】:

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

因为,我在做的时候遇到了差异问题;

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

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

谢谢,

【讨论】:

请查看How to write a good answer。不鼓励仅使用代码的答案,因为它们没有解释如何解决问题。您应该更新您的答案以解释它的作用以及它如何改进这个问题已有的许多答案【参考方案14】:

由于似乎还没有人提到它,所以检查 Moment 日期对象是否在过去的最简单方法:

momentObj.isBefore()

或者在未来:

momentObj.isAfter()

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

还有isSameOrAfterisSameOrBefore

注意这个因素及时。如果您只关心这一天,请参阅Dipendu's answer。

【讨论】:

文档解释说这是未定义的行为,所以你不应该这样做:momentjs.com/docs/#/query/is-before @Dancrumb 再读一遍。 “如果没有传递给 moment#isBefore,它将默认为当前时间。”在我的示例中,momentObj 是时刻日期的一个实例。文档专门讨论了创建一个新实例(当前时间),然后在一个语句中检查它是否在过去。我建议你做moment().isBefore(),这完全没有意义——你为什么要检查now是否在过去(或未来)? 这是我认为最好的答案,简短、准确、有效。【参考方案15】:

更新

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

我后来找到了isSame 函数,我认为这是确定日期是否是今天的正确函数。

原答案

以防万一其他人需要这个,只需这样做:

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

或者如果你想要一个函数:

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

date 是您要检查的日期。

说明

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

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

【讨论】:

【参考方案16】:

检查以下内容:

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

【讨论】:

【参考方案17】:

最简单的答案是:

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 小时时,它也可以工作。

【讨论】:

【参考方案18】:

我编写了函数来检查 Moment 类型的日期是否为已过去的日期,作为功能性和自我描述性函数。 也许它可以帮助某人。

function isItBeforeToday(MomentDate: Moment) 
  return MomentDate.diff(moment(0, 'HH')) < 0;


function isItAfterToday(MomentDate: Moment) 
  return MomentDate.diff(moment(0, 'HH')) > 0;

【讨论】:

以上是关于Moment JS - 检查日期是今天还是将来的主要内容,如果未能解决你的问题,请参考以下文章

检查日期是过去还是将来

moment.js,如何获取星期几

使用 Moment.js 格式化日期并减去天数

Moment.js - 我如何获得自日期以来的年数,而不是四舍五入?

Diff 不是 Moment.js 中的函数

moment.js 快捷查询