我正在尝试通过编写自己的事件日历来学习javascript,然后遇到了挑战。
我这样做是为了检查日期是否介于事件的开始日期和结束日期之间:
if(thisCellDate > startEventDate && thisCellDate < endEventDate) {}
thisCellDate是我正在循环的天数网格中的当前单元格(当月的日期)。问题是,当开始日期与网格中的单元格在同一天时,它不起作用,因为单元格的日期技术上更早。
他就是我所说的一个例子:
Start Date: Fri May 02 2014 15:01:16 GMT-0400 (Eastern Daylight Time)
Cell's Date: Sat May 02 2014 00:00:00 GMT-0400 (Eastern Daylight Time)
End Date: Thu May 29 2014 16:01:24 GMT-0400 (Eastern Daylight Time)
我生成Cell的日期,日期字符串如:new Date('8,8,2014')
现在我想我可以通过让单元格的日期尽可能接近下一个日期来解决这个问题:new Date(2013, 8, 8, 23, 59, 59, 999)
这样,事件日期应始终早于单元格日期。这样做有问题还是有更明确的方法?
答案 0 :(得分:9)
当人类指定仅限日期的范围时,它们往往是完全封闭的范围。从2014-01-01
到2014-01-02
有多少天了? TWO。
但是当混合时间添加到时间范围或日期+时间范围时,这些范围通常是半开范围。从1:00
到2:00
的小时数? ONE。
现在问题是JavaScript的Date
对象实际上是一个日期+时间对象。 (它的名字错误,恕我直言)。如果您没有指定时间,则会将时间设置为当天的第一时刻 - 通常(但不总是)午夜。
所以你可能认为你会这样做:
var a = new Date(2014, 0, 1);
var b = new Date(2014, 0, 2);
var inRange = dt >= a && dt <= b;
但这并不能说明Date
对象秘密添加的时间。 1月中旬的值不会包含在此范围内。
所以要补偿,你必须加一天,然后使用半开的间隔:
var a = new Date(2014, 0, 1);
var b = new Date(2014, 0, 2);
var c = new Date(b.getTime()); // clone the date to not muck the original value
c.setDate(c.getDate()+1); // add a day
var inRange = dt >= a && dt < c; // use a half-open interval
使用像23:59:59.999这样的缩短值可能会让你过去,但它一般不是一个好方法。从间隔结束中减去开始时间应该会给你准确的持续时间 - 不会减少一毫秒。