3

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

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

我们做一个对比:

d1 < d2;

这种比较将始终考虑小时、分钟、秒。

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

最简单的方法是什么?

也允许使用 jQuery。

4

4 回答 4

9

重置hours, minutes,secondsmilliseconds:

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

最后,比较结果Dates 是否相同 use getTime()

d1.getTime() == d2.getTime()
于 2012-09-20T17:25:31.813 回答
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函数 usingsetHours可以写成:

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;
}
于 2012-09-20T17:52:07.827 回答
1

您可以为每个 Date 手动将 Hours、Minutes 和 Seconds 设置为 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);
于 2012-09-20T17:25:42.330 回答
1

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

function compareDates(d1, d2) {
  var isoDate1 = d1.toISOString().substr(0, 10)
  var 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
于 2012-09-20T17:26:26.810 回答