2016-04-27 9 views
-1

私の管理パネルで、日付入力から日付を選択してサーバーに送信します。サーバーはMongoDB Dateフィールドにその値を格納します。それを送信する前に、私はsetHour(23,59,59,999)で日付を変更するので、カウントダウンは深夜に終了します(タイムゾーンは、世界のすべての人が同じ瞬間に終了する限り気にしません)。有効なタイムスタンプを取得する方法

(私はMeteorを使用しています)、Dateオブジェクトであるフィールドにクエリを行い、.getTime()のタイムスタンプを取得し、毎分、setIntervalのおかげで、単純に新しいDate()とし、hh:mm形式を出力します。

私は別のタイムゾーンにPCを置くと、次のインターバル計算で、左の時間の値が変更されます。同じタイムゾーンにないクライアントと同じことが起こります。つまり、残りの計算時間は絶対値で行われない可能性があります。

日付を選択:モンゴでそれを保存する

Meteor.call("saveDate", new Date(new Date(t.find("#form_date").value).setHours(23,59,59,999))); 

を、サーバ側:

saveDate: date => { DailyTopic.insert({ date: date }); }; 

クライアント計算および表示:

getTimeRemaining = function (limit) { 
    let endTime = new Date(limit).setHours(23, 59, 59, 999), 
     nowTime = Date.now(); 

    let t = endTime - nowTime; 

    let seconds = Math.floor((t/1000) % 60), 
     minutes = Math.floor((t/1000/60) % 60), 
     hours = Math.floor((t/(1000*60*60)) % 24); 

    return ({ 
    'hours' : hours, 
    'minutes' : minutes, 
    'seconds' : seconds 
    }); 
} 

Template.debate.onCreated(function() { 
    let self = this; 

    self.timeLeft = new ReactiveVar(null); 

    self.limit = getTodayTopic('fetch'); 

    self.interval = Meteor.setInterval(function() { 
    self.timeLeft.set(getTimeRemaining(getTodayTopic('fetch').date)); 
    }, (1000 * 60)); 

    setTimeout(function() { 
    self.timeLeft.set(getTimeRemaining(getTodayTopic('fetch').date)); 
    }, 3000); 

}); 
[...] 

displayIimeLeft: function() { 
    let time = Template.instance().timeLeft.get(), 
     sp = " "; 

    if (time) { 
     return (time.hours + sp + TAPi18n.__('hours') + sp + time.minutes + sp + TAPi18n.__('minutes')); 
    } 
    } 
... 

しかし、私の問題は、表示されたカウントダウンクライアントのタイムゾーンに応じて変わります。世界のどこでも同じものにする必要があります。

+0

Javascript日付は、1970-01-01T00:00:00Z以降のミリ秒を表すUTC時間値を使用します。ホストシステムのタイムゾーンに関係なく、時刻の値を単純に比較して、ある日付が前後にあるかどうかを確認できます。あなたが気にするのは、ホストクロックの精度に依存する実際の値の精度です。 – RobG

+0

はい、それはどこでも読んでいますが、コンピュータのタイムゾーンを変更するとすぐにカウントダウンは消えます!そのため、サーバーに近い人だけが正しくカウントダウンを見ることができます。 私はGMT + 2で、自分のPCをUTCやGMT0に置くと、カウントダウンの値が間違っていて、カウントダウンの終了時刻に近づけば、それは単に消えてしまいます。 –

+0

私は現在自分が何を持っているかを見ることができるように編集しました。(これまでに多くのことを試しました) –

答えて

1

あなたはちょうどあなたがJavascriptをタグ付けとして、それはこのように行われます、サーバーから期限日のDateオブジェクトを作成する必要があります。

var time = new Date(); 

すると、その日付オブジェクトに何が必要時に追加これは現在の時刻です。

その後、あなたは(自分のタイムゾーンで)あなたの顧客の日に(サーバーのタイムゾーンを持っている)そのDateオブジェクトを比較することができ、容易Moment.jsで行うことができる

moment(time).fromNow(); // E.g: in 24 Hours. 

実はこのMoment.jsもなくても簡単に行えますが、それはあなた次第です。 唯一のやり方は、日付をタイムゾーンと比較することです。あなたは、単に特定の時間までカウントダウンしている場合

+0

私はその方法を瞬時に使いましたが、問題は多言語システムが必要だということです。だから、カウントダウンのために、私はhh-mm-ss形式を探しています。 –

+0

私は現在私が何を見ているのかを見ることができるように編集しました –

0

、あなたもこれまでの時刻値を変換する必要はありません、あなただけ行うことができます。

var millisecondsLeft = timeValue - new Date(); 

と、それはそれです。値が負の場合は、時間の値で表される時間を過ぎています。

カウントダウンするUTC時刻の値を渡すと、ホストシステムではnew Date(timeValue)を使用して同等の日付を作成できます。

この方法を使用すると、ホストタイムゾーンは人間が読める文字列を出力するためにのみ使用され、日付の時間値には影響しません。 toISOStringのような方法(GMT)を使用すると、タイムゾーンの設定に関係なく、すべてのホストで正確に同じ時刻が表示されます。

あなたは、特定のシステムのために2016年5月25日の正午、たとえば、にカウントダウンしたいのであれば、そのシステム上の日付を作成し、その時刻の値を取得する:

var timeValue = new Date(2016, 4, 25, 12).getTime(); 

を今、他のシステムにあなたが行うことができます:

var date = new Date(timeValue); 

、あなたは時間(TIMEVALUEは数ではなく、文字列で提供する)で正確に同じ瞬間の日付を取得します。

時間値を取得する前に、時間値または日付オブジェクト(UTCメソッドを使用)に適切なオフセットを適用するだけで、任意の時間帯の時間値を作成することも簡単です。

+0

私は現在私が何を持っているかを見ることができるように編集しました(前に他の多くのことを試しました) –

関連する問題