检查一个日期是否在两个日期之间。

123

我需要检查一个日期date是否在两个具有相同格式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变量的值是NaN。你能帮我吗?

Daniel,你需要更新正确的答案。得票更多的答案仅检查月份而非日期。 - user3109233
15个回答

141

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)

3
正确解析日期字符串并不依赖于特定的解析器,这点值得点赞。+1 - RobG
2
考虑数据库约定,第一个日期应该是包含在内的。例如:check >= from && check < to - Onur Yıldırım
@二极管 检查:从2018年11月20日到2018年12月31日,如果日期为2018年02月23日,则返回true。 - chudasamachirag
5
这个问题是关于解析 dd/mm/yyyy 格式的。这些日期是以 mm/dd/yyyy 格式表示的。 - Diode

81

不要直接比较日期,而是比较日期的getTime()值。getTime()函数返回自1970年1月1日以来的毫秒数作为整数,这样就很容易确定一个整数是否落在另外两个整数之间。

类似这样:

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

NaN 没有 GetTimegetTime 方法? - Bergi
3
当日期格式为“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 <= endDate && compareDate >= startDate);希望这对其他人有所帮助 :) - Sayan
@SayanSamanta:你的解决方案简单而且有效。谢谢。其他人请注意:这里没有检查时间。 - Ananda Prasad Bandaru

25

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

示例: 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;
}

2
@Bergi:如果日期是NAN,那么此函数将返回False。因此,您要检查或传递的日期未提供无效,这是我和他之间代码的巨大区别 - Pandian
但是OP的if条件也会这样做吗?而且问题是关于日期在第一次出现时是否NaN(在所有浏览器中都不是)。 - Bergi
如果我想检查当前时间是否在早上7点到晚上9点之间,该怎么办? - Si8
dateCheck("20/01/2015","22/01/2015","21/02/2015")这个案例不起作用 - Bhavin Rana
@BhavinRana 这个案例不起作用,因为您使用了 dd/mm/yyyy 格式 - 正确的格式应该是 mm/dd/yyyy。 - Mike

11

基于已接受的答案,可以简化完成此操作的方式。

在我的情况下,我需要检查当前日期(今天)是否在另外两个日期范围内,因此使用了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);


这段代码在Safari中无法运行。 - Ulugbek
@Ulugbek 刚在最新的 Safari 15.6 中进行了测试,它可以正常工作。这是一个测试链接 - https://codepen.io/andrew_mykhalchuk/pen/gOejKpW - Andrew Mykhalchuk

11

得到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);

3

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

var getvalidDate = function(d){ return new Date(d) }

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

1

这是一个用TypeScript编写的日期原型方法:

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();
};

1

我做了和第一个回答者@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);
        }
})


1
假设例如您的日期是这样的,而且您需要安装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
    }

0

这可能会感觉更直观。参数只是一个有效的日期字符串。 如果作为参数传递的日期在当前周内,则此函数返回true,否则返回false。

function isInThisWeek(dateToCheck){
// Create a brand new Date instance
const WEEK = new Date()

// create a date instance with the function parameter 
//(format should be like dd/mm/yyyy or any javascript valid date format )
const DATEREF = new Date(dateToCheck)

// If the parameter is a not a valid date, return false
if(DATEREF instanceof Date && isNaN(DATEREF)){ 
  console.log("invalid date format")
  return false}

// Get separated date infos (the date of today, the current month and the current year) based on the date given as parameter
const [dayR, monthR, yearR] = [DATEREF.getDate(), DATEREF.getMonth(), DATEREF.getFullYear()]

// get Monday date by substracting the day index (number) in the week from the day value (count) 
//in the month (like october 15th - 5 (-> saturday index)) and +1 because 
//JS weirdly starts the week on sundays
const monday = (WEEK.getDate() - WEEK.getDay()) + 1

// get Saturday date
const sunday = monday + 6

// Start verification
if (yearR !== WEEK.getFullYear())  { console.log("WRONG YEAR"); return false }
if (monthR !== WEEK.getMonth()) { console.log("WRONG MONTH"); return false }
if(dayR >= monday && dayR <= sunday) { return true }
else {console.log("WRONG DAY"); return false}

}

嗨@Wilfried。 你能否格式化你的代码以解释你提供的解决方案。 目前答案看起来不正常工作。 谢谢! - Tobias Schäfer
我会这样做。 @TobiasSchäfer 但是哪里出了问题? - Wilfried

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接