2011-11-15 20 views
5

JavaScript Dateオブジェクトを使用して、ミリ秒を読み込み可能なminutes:secondsの書式設定された文字列に変換しています。自分のJSインターフェースがミリ秒の値としてビデオ期間情報を受け取るカスタムビデオプレーヤー用のタイマーを作成する必要があります。不正な値を返すgetHours()

ビデオを59分以上長くする可能性をサポートすることを決める前に、かなり簡単な作業でした。そして、私はこの問題に遭遇しました:新しいDateオブジェクトのコンストラクタにミリ秒の値を渡してからgetHours()を呼び出すと、ミリ秒数が1時間未満の場合でも何かが返されます。この動作を確認する最も簡単な方法は、たとえば、0

enter image description here

それを供給することである私はそれが0を返すことを期待したいが、それは常にそれがさらに可能オペラ、12(13を返します。奇妙な)。これは正常な動作ですか、それともバグですか?いずれにしても、ミリ秒の値が数分と数秒に制限されているのか、時間が含まれているのかを確実に検出する方法はありますか?

ありがとうございました。

UPD:

私はOSX上でクロム15とFirefox 7でそれをテストしてみた:上のスクリーンショットあたりと同じ結果に。私はOpera Dragonflyコンソールの使い方を理解することはできませんが、同じことがOperaで起こるのは、getHours()の13という値だけです。

+0

ここでは、 'Date'コンストラクタを使いたくありません。 'new Date(n)'は日付が1970年1月1日+ 'n'ミリ秒に設定された' Date'オブジェクトを返します。これは確かにあなたが望むものではありません... –

+0

@ŠimeVidas、何が良い選択肢でしょうか? – Arnold

+0

私自身の関数を書くだろう。 –

答えて

7

new Date(0).toString()を呼び出して、影響を受けるタイムゾーンがあるかどうかを確認してください。

私はGMT + 2日午前、そうgetHoursは私に2を与えるので鉱山が

"Thu Jan 01 1970 02:00:00 GMT+0200 (FLE Standard Time)" 

を与えます。

UnixエポックはGMT + 0

が時点で信頼性の高いミリ秒を取得し、数としてそれを維持するために+new Dateを使用することです。実際の日付オブジェクト内で何も計算をしないでください。ここで

は、私が使用しているものです:

var toTimeString = function(secs) { 
var days, hours, minutes, seconds; 

    if(secs == null) 
    return ""; 

days = (secs/86400) >> 0; 
hours = (secs % 86400/3600) >> 0; 
minutes = (secs % 3600/60) >> 0; 
seconds = (secs % 60);  
seconds = seconds < 10 ? "0" + seconds : seconds; 
minutes = minutes < 10 ? "0" + minutes : minutes; 
hours = hours && hours < 10 ? "0" + hours : hours; 

return "" + (days ? days+" - " : "") + (hours ? hours+":" : "") + minutes + ":" + seconds;  
}; 

は、必要に応じて。これは、実際秒かかりそう秒を取得するために1000ミリ秒を分割カスタム書式適用します。

+0

右、タイムゾーン。私はニュージーランドにいるので、私の場合は12時間が0になります。それについては決して考えなかったでしょう、ありがとう!それが問題を解決するわけではありませんが、実際にこのアプローチがいかに信頼できないかを示しています... – Arnold

0

代わりに年、月、日、時間、分、秒、ミリ秒の値を指定してみてください。

var sampleTime = new Date(1900,1,1,0,0,0,0); 
+1

それは1900年2月1日です。月はゼロベースです。例えば1月は月が0です。 – gilly3

+0

@ gilly3良い点、私はそれを忘れてしまった。とにかく、日付はやや恣意的です。この場合、重要な時期です。 – GregL

2

私はあなたがこれを求めていない知っている、そしてそれはそうではない答えを得るために迷惑なんですあなたの質問にお答えしますが、このケースでは...私は真剣にDatejsに切り替えることをお勧めします。これは、あまり強力ではなく、多くのトラブルの原因となるJSのネイティブDate()タイムゾーンを標準化する必要があります。 http://www.datejs.com/

13

私は、人々がコードを修正する方法をユーザーに通知したが、彼は彼に質問したことをどのようにするかを彼に知らせなかったことに気付きました。答えはかなり簡単です。関数getHours()は使わないでください。 getUTCHours()を使用してください。これはタイムゾーンオフセットをバイパスします。

これまでに何度も作業する必要がある場合でも問題は残りますが、それまでは、Dateプリミティブは使用するものに対してうまく機能します。

+0

ありがとう、GetUTCHoursは他のトリッキーの必要なしに私の同様の問題を修正しました。 – fubeca

関連する問題