【问题标题】:Check if one date is between two dates检查一个日期是否在两个日期之间
【发布时间】:2013-04-11 09:58:56
【问题描述】:

我需要检查 date - dd/mm/yyyy 格式的字符串 - 位于其他两个具有相同格式的日期之间dd/mm/yyyy

我试过了,但它不起作用:

var dateFrom = "02/05/2013";
var dateTo = "02/09/2013";
var dateCheck = "02/07/2013";

var from = Date.parse(dateFrom);
var to   = Date.parse(dateTo);
var check = Date.parse(dateCheck );

if((check <= to && check >= from))      
    alert("date contained");

我使用调试器并检查,tofrom 变量具有 isNaN 值。 你能帮帮我吗?

【问题讨论】:

  • 丹尼尔,您需要更新正确答案。投票多的答案不会只检查几个月的日期

标签: javascript date


【解决方案1】:

Date.parse 支持mm/dd/yyyy 不支持dd/mm/yyyy 格式。对于后者,要么使用像 moment.js 这样的库,要么执行如下所示的操作

var dateFrom = "02/05/2013";
var dateTo = "02/09/2013";
var dateCheck = "02/07/2013";

var d1 = dateFrom.split("/");
var d2 = dateTo.split("/");
var c = dateCheck.split("/");

var from = new Date(d1[2], parseInt(d1[1])-1, d1[0]);  // -1 because months are from 0 to 11
var to   = new Date(d2[2], parseInt(d2[1])-1, d2[0]);
var check = new Date(c[2], parseInt(c[1])-1, c[0]);

console.log(check > from && check < to)

【讨论】:

  • +1 用于正确解析日期字符串,而不是将其留给依赖于实现的解析器。
  • 考虑数据库约定,第一个日期应该包含在内。例如check &gt;= from &amp;&amp; check &lt; to
  • @Diode check :02/23/2018 from:11/20/2018 to:12/31/2018 它返回 true。
  • @chudasamachirag:问题是关于解析 dd/mm/yyyy 格式的。这些日期采用 mm/dd/yyyy 格式
【解决方案2】:

不是直接比较日期,而是比较日期的 getTime() 值。 getTime() 函数以整数形式返回自 1970 年 1 月 1 日以来的毫秒数——判断一个整数是否介于其他两个整数之间应该很简单。

类似

if((check.getTime() <= to.getTime() && check.getTime() >= from.getTime()))      alert("date contained");

【讨论】:

  • NaN 既没有 GetTime 也没有 getTime 方法?
  • 当日期格式为 - 02/05/2013 但日期为 iso 格式(日期+时间)时,如 - 2019-09-12T13:02:14.291Z 然后使用setHours 比较日期之前的方法,例如 - let compareDate = new Date('checkDate').setHours(0, 0, 0, 0); let startDate = new Date('startDate').setHours(0, 0, 0, 0); let endDate = new Date('endDate').setHours(0, 0, 0, 0); console.log(compareDate &lt;= endDate &amp;&amp; compareDate &gt;= startDate); 希望它会帮助其他人:)
  • @SayanSamanta:您的解决方案很简单而且很有效。谢谢。其他人注意:这里没有检查时间。
【解决方案3】:

试试下面的内容。它会帮助你...

小提琴: http://jsfiddle.net/RYh7U/146/

脚本:

if(dateCheck("02/05/2013","02/09/2013","02/07/2013"))
    alert("Availed");
else
    alert("Not Availed");

function dateCheck(from,to,check) {

    var fDate,lDate,cDate;
    fDate = Date.parse(from);
    lDate = Date.parse(to);
    cDate = Date.parse(check);

    if((cDate <= lDate && cDate >= fDate)) {
        return true;
    }
    return false;
}

【讨论】:

  • @Bergi: If Date is NAN then this function return False So the Date you check Or Pass is Not Availed or In Valid 这是我和他的代码之间的地狱差异
  • 但是 OP 的 if 条件也能做到这一点?问题是关于日期 being NaN 首先(并非在所有浏览器中)
  • 如果我想检查now 是否属于7:00am9:00pm,该怎么办
  • dateCheck("20/01/2015","22/01/2015","21/02/2015") 这种情况不起作用
  • @BhavinRana 这种情况不起作用,因为您使用 dd/mm/yyyy - 正确的是 mm/dd/yyyy
【解决方案4】:

有 50 票的答案不检查日期,只检查几个月。这个答案是不正确的。下面的代码有效。

var dateFrom = "01/08/2017";
var dateTo = "01/10/2017";
var dateCheck = "05/09/2017";

var d1 = dateFrom.split("/");
var d2 = dateTo.split("/");
var c = dateCheck.split("/");

var from = new Date(d1);  // -1 because months are from 0 to 11
var to   = new Date(d2);
var check = new Date(c);

alert(check > from && check < to);

这是另一个答案中发布的代码,我已经更改了日期,这就是我注意到它不起作用的原因

var dateFrom = "02/05/2013";
var dateTo = "02/09/2013";
var dateCheck = "07/07/2013";

var d1 = dateFrom.split("/");
var d2 = dateTo.split("/");
var c = dateCheck.split("/");

var from = new Date(d1[2], parseInt(d1[1])-1, d1[0]);  // -1 because months are from 0 to 11
var to   = new Date(d2[2], parseInt(d2[1])-1, d2[0]);
var check = new Date(c[2], parseInt(c[1])-1, c[0]);


alert(check > from && check < to);

【讨论】:

    【解决方案5】:

    根据接受的答案进行此操作的简化方法。

    就我而言,我需要检查当前日期(今天)是否在其他两个日期的范围内,因此使用 newDate() 而不是硬编码值,但您可以了解如何使用硬编码日期。

    
    var currentDate = new Date().toJSON().slice(0,10);
    var from = new Date('2020/01/01');
    var to   = new Date('2020/01/31');
    var check = new Date(currentDate);
    
    console.log(check > from && check < to);
    
    

    【讨论】:

      【解决方案6】:

      我创建了自定义函数来验证给定日期是否在两个日期之间。

      var getvalidDate = function(d){ return new Date(d) }
      
      function validateDateBetweenTwoDates(fromDate,toDate,givenDate){
          return getvalidDate(givenDate) <= getvalidDate(toDate) && getvalidDate(givenDate) >= getvalidDate(fromDate);
      }
      

      【讨论】:

        【解决方案7】:

        试试这个:

        HTML

        <div id="eventCheck"></div>
        

        JAVASCRIPT

        // ----------------------------------------------------//
        // Todays date
        var today = new Date();
        var dd = today.getDate();
        var mm = today.getMonth()+1; //January is 0!
        var yyyy = today.getFullYear();
        
        // Add Zero if it number is between 0-9
        if(dd<10) {
            dd = '0'+dd;
        }
        if(mm<10) {
            mm = '0'+mm;
        }
        
        var today = yyyy + '' + mm + '' + dd ;
        
        
        // ----------------------------------------------------//
        // Day of event
        var endDay = 15; // day 15
        var endMonth = 01; // month 01 (January)
        var endYear = 2017; // year 2017
        
        // Add Zero if it number is between 0-9
        if(endDay<10) {
            endDay = '0'+endDay;
        } 
        if(endMonth<10) {
            endMonth = '0'+endMonth;
        }
        
        // eventDay - date of the event
        var eventDay = endYear + '/' + endMonth + '/' + endDay;
        // ----------------------------------------------------//
        
        
        
        // ----------------------------------------------------//
        // check if eventDay has been or not
        if ( eventDay < today ) {
            document.getElementById('eventCheck').innerHTML += 'Date has passed (event is over)';  // true
        } else {
            document.getElementById('eventCheck').innerHTML += 'Date has not passed (upcoming event)'; // false
        }
        

        小提琴: https://jsfiddle.net/zm75cq2a/

        【讨论】:

          【解决方案8】:

          这是一个用 typescript 编写的 Date Prototype 方法:

          Date.prototype.isBetween = isBetween;
          interface Date { isBetween: typeof isBetween }
          function isBetween(minDate: Date, maxDate: Date): boolean {
            if (!this.getTime) throw new Error('isBetween() was called on a non Date object');
            return !minDate ? true : this.getTime() >= minDate.getTime()
              && !maxDate ? true : this.getTime() <= maxDate.getTime();
          };
          

          【讨论】:

            【解决方案9】:

            我做了与@Diode,第一个答案相同的事情,但我用一系列日期设定了条件,我希望这个例子对某人有用

            例如(与日期数组示例相同的代码)

            var dateFrom = "02/06/2013";
            var dateTo = "02/09/2013";
            
            var d1 = dateFrom.split("/");
            var d2 = dateTo.split("/");
            
            var from = new Date(d1[2], parseInt(d1[1])-1, d1[0]);  // -1 because months are from 0 to 11
            var to   = new Date(d2[2], parseInt(d2[1])-1, d2[0]); 
            
            
            
            var dates= ["02/06/2013", "02/07/2013", "02/08/2013", "02/09/2013", "02/07/2013", "02/10/2013", "02/011/2013"];
            
            dates.forEach(element => {
               let parts = element.split("/");
               let date= new Date(parts[2], parseInt(parts[1]) - 1, parts[0]);
                    if (date >= from && date < to) {
                       console.log('dates in range', date);
                    }
            })

            【讨论】:

              【解决方案10】:

              例如,假设您的日期即将到来,并且您需要安装 momentjs 以获得提前日期功能。

              let cmpDate = Thu Aug 27 2020 00:00:00 GMT+0530 (India Standard Time)
              
                  let format = "MM/DD/YYYY";
                  let startDate: any = moment().format(format);
                  let endDate: any = moment().add(30, "days").format(format);
                  let compareDate: any = moment(cmpDate).format(format);
                  var startDate1 = startDate.split("/");
                  var startDate2 = endDate.split("/");
                  var compareDate1 = compareDate.split("/");
              
                  var fromDate = new Date(startDate1[2], parseInt(startDate1[1]) - 1, startDate1[0]);
                  var toDate = new Date(startDate2[2], parseInt(startDate2[1]) - 1, startDate2[0]);
                  var checkDate = new Date(compareDate1[2], parseInt(compareDate1[1]) - 1, compareDate1[0]);
              
                  if (checkDate > fromDate && checkDate < toDate) {
                    ... condition works between current date to next 30 days
                  }
              

              【讨论】:

                【解决方案11】:

                试试这个

                var gdate='01-05-2014';
                        date =Date.parse(gdate.split('-')[1]+'-'+gdate.split('-')[0]+'-'+gdate.split('-')[2]);
                        if(parseInt(date) < parseInt(Date.now()))
                        {
                            alert('small');
                        }else{
                            alert('big');
                        }
                

                Fiddle

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 2012-09-19
                  • 2017-07-07
                  • 2016-05-31
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多