哇。这变得很奇怪。
这与画布无关。它与您的 BinaryTime 类有关。至少 Chrome 和 Firefox 之间的 Date 对象的功能存在一些差异。
beginning
andend
是1370318400000
和在1370404800000
FireFox 中。每次。大概这就是您想要查看评论的内容。
它们在 Chrome 中每次都在变化,这意味着它们绝对不代表今天早上的午夜和今晚的午夜,正如您的评论所暗示的那样。
换句话说,Chrome/webkit 中的 Date 对象似乎已损坏。但它更准确。它在 Firefox 中以更微妙的方式不太准确,但现在让我们专注于修复。(今晚晚些时候,我会一边对着一桶冰淇淋哭泣,一边提交一些错误报告)。
但是 Chrome 在这里做的是正确的事情,因为你没有打电话setMilliseconds
,而且 chrome 尊重这一点。Firefox 变得很奇怪并且做错了事,但它恰好是你想要的。
所以无论如何,最简单的方法是使用setHours
所有四个参数:
// init "beginning" timestamp as midnight this morning
var beginning = new Date();
beginning.setHours(0, 0, 0, 0);
beginning = beginning.getTime();
// init "end" timestamp as as midnight tonight
var end = new Date(date);
end.setHours(0, 0, 0, 0);
end.setDate(end.getDate() + 1);
end = end.getTime();
我现在就这么做。工作示例:
http://jsfiddle.net/wvR6H/
稍微复杂一点的问题是,在 Chrome/WebKit 中,您还需要设置毫秒:
blah.setMilliseconds(0);
您还需要在 FireFox 中进行设置,因为您现在正在编写代码,所以您正在利用一种 Firefox 错误。如果你有 Firefox ,它也会beginning = new Date()
被“破坏” ,换句话说,它有一个空的构造函数。例如见这里:http: //jsfiddle.net/VbWnk/
碰巧的是,Firefox 中的 new Date(new Date()) 会为您减少毫秒数。实际上,公平地说,IE 的工作方式相同,因此 Chrome/Webkit 是一个奇怪的结果。ECMAScript 规范并不清楚谁是正确的(FF/IE 似乎是正确的,但对于 EcmaScript 6 的讨论表明它们可能是特殊情况new Date(Date)
。从技术上讲,Date 对象不是 Date 构造函数可接受的参数,但字符串是,并且日期字符串不包含毫秒,这表明 FireFox/IE 更正确,但 WebKit 的方式也可以理解,将来可能会正确。
...但是无论如何,setHours(a,b,c,d)
将小时、分钟、秒、毫秒设置为速记,这样更容易编写。
希望你的项目进展顺利。