2011-07-07 6 views
2

こんにちはすべてのjavascriptの達人、日時はjavascriptで、バグですか?

私はこのJavaScriptのコードに遭遇して、なぜそれが期待どおりに動作しなかったのか理解できなくなってしまいました。だから私はここにあなたの助けを求めて投稿すると思った。

基本的に、Dateはミリ秒の形式に変換され、ミリ秒の値はDateオブジェクトに変換されますが、比較すると同じではありませんか?

var currentTime = new Date(); 
var currentTimeInMill = Date.parse(currentTime); 
var currentTime2 = new Date(currentTimeInMill); 

// debug in firefox 
console.log(currentTime); 
// Date {Thu Jul 07 2011 09:56:19 GMT+1000 (AUS Eastern Standard Time)} 

console.log(currentTime2); 
// Date {Thu Jul 07 2011 09:56:19 GMT+1000 (AUS Eastern Standard Time)} 

console.log(currentTime == currentTime2); 
// false 

その2つの値CURRENTTIMEとcurrentTime2もそれらの値と等しくない理由私の質問は、Firefoxのはconsole.logに同じ「見た目」ですか?

答えて

1

minitechが指摘するように、ミリ秒を順番に、DateオブジェクトのtoStringメソッドから取り除かれ、のでcurrentTimeの数値がの数値になることを絶対に確かめるには、currentTime2のミリ秒を設定する必要があります。

currentTime2.setMilliseconds(currentTime % 1000); 

次に、コンパクターが指摘するように、DategetTime出力をそれぞれ比較することができます。だから、完了時、それはこのようなものになります。

var currentTime = new Date(); 
var currentTimeInMill = Date.parse(currentTime); 
var currentTime2 = new Date(currentTimeInMill); 
currentTime2.setMilliseconds(currentTime % 1000); 

// debug in firefox 
console.log(currentTime); 
// Date {Thu Jul 07 2011 09:56:19 GMT+1000 (AUS Eastern Standard Time)} 

console.log(currentTime2); 
// Date {Thu Jul 07 2011 09:56:19 GMT+1000 (AUS Eastern Standard Time)} 

console.log(currentTime.getTime() == currentTime2.getTime()); 
3

タイムストリングが往復しないためです。これを試してみると:

var currentTime = new Date(); 
var currentTimeInMill = Date.parse(currentTime); 
var currentTime2 = new Date(currentTimeInMill); 

console.log(currentTime.getTime()); 

console.log(currentTime2.getTime()); 

console.log(currentTime == currentTime2); 
// false 

時間が異なることがわかります。 currentTime2は3つのゼロで終わり、currentTimeはそれ以外のものを持っています。それはミリ秒単位で、日付文字列には明らかに含まれていないわずかな違いです。

+0

@colves、それはありません。オブジェクトの比較について自分の答えで言うことは正しいが、Date.parseを使用することの結果についてminitechが述べたことも正しいので、自分の答えも間違っている。 'getTime()'戻り値を比較すると、期待される結果が得られる確率は0.1%です( 'currentTime'が1000ミリ秒の倍数でインスタンス化されている場合のみ)。 – eyelidlessness

+0

ええ、私はあなたを解体しようとしましたが、答えを修正しない限りできません:) - 編集して+1しました:) –

3

彼らはまったく同じオブジェクトを参照しない限り、あなたは今までに==を使用して等しくなるようにJavaScriptで二つの「オブジェクト」を取得することはできません。 Javascriptの等価性は、値が類似しているかどうかを確認する前に同じオブジェクトを参照しているかどうかを確認します。オブジェクトを比較するとき

は、簡単に言えば、 =====と同じです

あなたのチェックは次のようになります。

currentTime.getTime() == currentTime2.getTime(); 
// or 
+currentTime == +currentTime2; // cast both to numbers and compare the numbers 
+3

両方の答えが実際にここに実際に適用されます。 BeCoolのコードは、実際には異なる値を持つ2つのDateオブジェクトを生成します。なぜなら、 'Date.parse'は' 'GetTime() 「文字列表現を見る」;秒未満の精度は破棄されています。 –

+0

'underscore.js'にリンクすれば、' _.isEqual(currentTime、currentTime2) 'を使って等価性をチェックできます。 – William

+0

@Lime - 2回目のスナップショットが実際に短いときにライブラリを使用するのはなぜですか? –

0

CURRENTTIME-currentTime2の=== 0をthet二つの日付が同じタイムスタンプを参照してテストするための簡単な方法です。

関連する問題