In meinem Admin-Panel wähle ich ein Datum aus einer Date-Eingabe aus und sende es an den Server, der es in einem MongoDB-Datumsfeld speichert. Bevor ich es sende, ändere ich das Datum mit einer setHour(23,59,59,999)
, so dass der Countdown um Mitternacht endet (egal welche Zeitzone mir egal ist, solange sie im selben Moment für jeden auf der Welt endet).So erhalten Sie einen weltweit gültigen Zeitstempel
Dann (ich benutze Meteor), frage ich die Felder, die ein Date-Objekt ist, bekomme ich seinen Zeitstempel mit einer .getTime()
, und jede Minute, dank einer setInterval
, berechne ich einfach die verbleibende Zeit mit einem neuen Date()
, und geben Sie ein hh:mm
Format aus.
Aber, wenn ich meinen PC auf eine andere Zeitzone setze, wird bei der nächsten Intervallberechnung der Wert der verbleibenden Zeit geändert. Das gleiche passiert auch bei meinen Kunden, die nicht in derselben Zeitzone liegen. Das bedeutet, dass die Berechnung der verbleibenden Zeit wahrscheinlich nicht mit absoluten Werten erfolgt.
Auswahl des Datums:
Meteor.call("saveDate", new Date(new Date(t.find("#form_date").value).setHours(23,59,59,999)));
es in Mongo Speicher, Server-Seite:
saveDate: date => { DailyTopic.insert({ date: date }); };
Client-Berechnung und Anzeige:
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'));
}
}
...
Aber mein Problem ist, dass der angezeigte Countdown Ändert sich entsprechend der Client-Zeitzone, wenn es überall auf der Welt gleich sein muss!
Javascript Datumsangaben verwenden einen UTC-Zeitwert, der Millisekunden seit 1970-01-01T00: 00: 00Z darstellt. Sie können Zeitwerte einfach vergleichen, um zu sehen, ob ein Datum vor oder nach dem anderen liegt, unabhängig von der Zeitzone des Hostsystems. Alles, was Ihnen wichtig ist, ist die Genauigkeit des tatsächlichen Werts, der von der Genauigkeit der Host-Uhr abhängt. – RobG
Ja, das habe ich überall gelesen, aber sobald ich meine Computer-Zeitzone ändere, verschwindet der Countdown! Aus diesem Grund können nur die Personen, die sich in der Nähe des Servers befinden, den Countdown korrekt sehen. Ich bin in GMT + 2, wenn ich meinen PC auf UTC oder GMT0 setze, ist der Countdown-Wert falsch und wenn es nah genug an der Endzeit des Countdowns ist, verschwindet es einfach. –
Ich bearbeitet, so dass Sie sehen können, was ich gerade habe (ich habe viele andere Dinge vorher versucht) –