web-dev-qa-db-ja.com

2回のJavaScript間の時間差を計算する

私はこれを行う方法を探していましたが、複雑なコードの例がたくさん見つかりました。私はこれを使用しています:

var time1 = new Date();
var time1ms= time1.getTime(time1); //i get the time in ms  

それから私はコードの他の部分でこれを行います

var time2 = new Date();
var time2ms= time2.getTime(time2); 

そして最後に:

var difference= time2ms-time1ms;
var lapse=new Date(difference);  
label.text(lapse.getHours()+':'+lapse.getMinutes()+':'+lapse.getSeconds());

これはうまく機能しますが、1つの問題を除いて、与えられた時間は常に+1なので、コードに追加する必要があります(time.getHours()-1)そうでない場合は、さらに1時間かかります。 ...。

他のすべての例よりも簡単な方法だと思います...しかし、正しい失効を得るために「-1」を追加する必要がある理由がまだわかりません。

サンクス!!!

8
user2314770

問題はあなたのタイムゾーンです。

new Date(difference)を実行すると、1970年1月1日から正確にDateミリ秒後の瞬間を表すdifferenceオブジェクトが作成されます。lapse.getHours()を実行すると、タイムゾーンが計算に使用されます。 Javascriptを介してタイムゾーンを変更したり、この動作を変更したりすることはできません。いくつかの重い Javascriptのトリックなしではありません。

しかし、あなたのdifferencenotは日付を表しますが、differenceは日付を表します。扱いはそのようなものであり、次のように時間、分、秒を計算します。

var hours = Math.floor(difference / 36e5),
    minutes = Math.floor(difference % 36e5 / 60000),
    seconds = Math.floor(difference % 60000 / 1000);

または、lapseを作成するときにタイムゾーンを考慮に入れることもできます。

var lapse = new Date(difference + new Date().getTimezoneOffset() * 1000);

しかし、私はこれをお勧めしません:Dateオブジェクトはあなたの目的にはやり過ぎです。

12
MaxArt

getTimezoneOffset()は分単位で値を返すため、経過を使用する場合は、次のようにタイムゾーンの違いを修正できます。

lapse = new Date(difference); 
tz_correction_minutes = new Date().getTimezoneOffset() - lapse.getTimezoneOffset();
lapse.setMinutes(offset_date.getMinutes() + tz_correction_minutes);

今、あなたはできる:

label.text(lapse.getDate()-1+' days and'  +lapse.getHours()+':'+lapse.getMinutes()+':'+lapse.getSeconds());

人間が読める形式で時差を印刷する

2
Matthijs