私の管理パネルで、日付入力から日付を選択してサーバーに送信します。サーバーは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'));
}
}
...
しかし、私の問題は、表示されたカウントダウンクライアントのタイムゾーンに応じて変わります。世界のどこでも同じものにする必要があります。
Javascript日付は、1970-01-01T00:00:00Z以降のミリ秒を表すUTC時間値を使用します。ホストシステムのタイムゾーンに関係なく、時刻の値を単純に比較して、ある日付が前後にあるかどうかを確認できます。あなたが気にするのは、ホストクロックの精度に依存する実際の値の精度です。 – RobG
はい、それはどこでも読んでいますが、コンピュータのタイムゾーンを変更するとすぐにカウントダウンは消えます!そのため、サーバーに近い人だけが正しくカウントダウンを見ることができます。 私はGMT + 2で、自分のPCをUTCやGMT0に置くと、カウントダウンの値が間違っていて、カウントダウンの終了時刻に近づけば、それは単に消えてしまいます。 –
私は現在自分が何を持っているかを見ることができるように編集しました。(これまでに多くのことを試しました) –