假设我们在 Javascript 中有 2 个 Date 对象;
var d1 = new Date('...');
var d2 = new Date('...');
我们做一个对比:
d1 < d2;
这种比较将始终考虑小时、分钟、秒。
我希望它只考虑年份、月份和日期进行比较。
最简单的方法是什么?
也允许使用 jQuery。
假设我们在 Javascript 中有 2 个 Date 对象;
var d1 = new Date('...');
var d2 = new Date('...');
我们做一个对比:
d1 < d2;
这种比较将始终考虑小时、分钟、秒。
我希望它只考虑年份、月份和日期进行比较。
最简单的方法是什么?
也允许使用 jQuery。
作为代数解决方案,您可以运行一些数学运算:
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;
}
您可以为每个 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);
我会将 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