わお。これは奇妙になります。
これはキャンバスとは関係ありません。BinaryTime クラスに関係しています。少なくとも Chrome と Firefox では、Date オブジェクトの機能に多少の違いがあります。
beginning
とend
はFireFoxの1370318400000
とです。1370404800000
毎回。おそらく、これはコメントを見て欲しいものです。
つまり、コメントが示唆するように、今朝の真夜中と今夜の真夜中を表しているわけではありません。
つまり、Chrome/webkit の Date オブジェクトが壊れているように見えます。しかし、それはより正確です。Firefox ではより微妙な方法で精度が低下しますが、ここでは修正に焦点を当てます。(今夜遅く、アイスクリームの浴槽に泣きながら、いくつかのバグレポートを提出します)。
しかし、あなたは呼び出しておらずsetMilliseconds
、クロムはそれを尊重しているので、Chromeはここで正しいことをしています. Firefox はおかしくなり、間違ったことをしますが、たまたまあなたが望んでいることです。
とにかく、すぐに使える簡単な方法は、setHours
4 つの引数すべてを使用することです。
// 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 の話は、それらが特殊なケースである可能性があることを示しています。Datenew Date(Date)
オブジェクトは技術的には Date コンストラクターの引数として受け入れられませんが、文字列はそうであり、日付文字列にミリ秒が含まれていない. これは、FireFox/IE がより正確であることを示唆していますが、WebKit の方法も理解可能であり、将来的には正しい可能性があります.
...しかし、とにかく、setHours(a,b,c,d)
時、分、秒、ミリ秒を省略形として設定するので、書きやすくなります。
あなたのプロジェクトがうまくいくことを願っています。