仅按年,月和日期比较日期?

时间:2012-09-20 17:21:41

标签: javascript jquery

假设我们在Javascript中有2个Date对象;

var d1 = new Date('...');
var d2 = new Date('...');

我们进行比较:

d1 < d2;

此比较将始终考虑小时,分钟,秒。

我希望它只考虑年份,月份和日期进行比较。

最简单的方法是什么?

允许使用jQuery。

4 个答案:

答案 0 :(得分:8)

重置hoursminutessecondsmilliseconds

var d1 = new Date();
d1.setHours(0);
d1.setMinutes(0);
d1.setSeconds(0);
d1.setMilliseconds(0);

或者使用setHours,这不是那么详细:

var d1= new Date();
d1.setHours(0, 0, 0, 0);

最后,要比较生成的Date是否相同使用getTime()

d1.getTime() == d2.getTime()

答案 1 :(得分:2)

作为一种代数解决方案,你可以运行一些数学运算:

function sameDay(d1, d2) {
    return d1 - d1 % 86400000 == d2 - d2 % 86400000
}

这个等式实际上分解为:

function sameDay(d1, d2) {
    var d1HMS, //hours, minutes, seconds & milliseconds
        d2HMS,
        d1Day,
        d2Day,
        result;
    //d1 and d2 will be implicitly cast to Number objects
    //this is to be explicit
    d1 = +d1;
    d2 = +d2;
    //1000 milliseconds in a second
    //60 seconds in a minute
    //60 minutes in an hour
    //24 hours in a day
    //modulus used to find remainder of hours, minutes, seconds, and milliseconds
    //after being divided into days
    d1HMS = d1 % (1000 * 60 * 60 * 24);
    d2HMS = d2 % (1000 * 60 * 60 * 24);
    //remove the remainder to find the timestamp for midnight of that day
    d1Day = d1 - d1HMS;
    d2Day = d2 - d2HMS;
    //compare the results
    result = d1Day == d2Day;
    return result;
}

这样做的好处是不会丢失原始Date对象的数据,因为setHours等会修改引用的对象。

或者,使用sameDay的安全setHours函数可写为:

function sameDay(d1, d2) {
    var a,
        b;
    a = new Date(+d1);
    b = new Date(+d2);
    a.setHours(0, 0, 0, 0);
    b.setHours(0, 0, 0, 0);
    return +a == +b;
}

答案 2 :(得分:1)

您可以为每个日期手动将小时,分钟和秒设置为0:

var d1 = new Date('...');
d1.setHours(0);
d1.setMinutes(0);
d1.setSeconds(0);

var d2 = new Date('...');
d2.setHours(0);
d2.setMinutes(0);
d2.setSeconds(0);

答案 3 :(得分:0)

我会将Date对象转换为ISO日期格式("2012-09-20"),可以按字典顺序对比为字符串:

function compareDates(d1, d2) {
  var isoDate1 = d1.toISOString().substr(0, 10)
    , isoDate2 = d2.toISOString().substr(0, 10);
  return isoDate1.localeCompare(isoDate2);
}
compareDates(new Date("2010-01-01"), new Date("2010-01-01")); // => 0
compareDates(new Date("2010-01-01"), new Date("2012-01-01")); // => -1
compareDates(new Date("2012-01-01"), new Date("2010-01-01")); // => 1