2016-04-27 2 views
-1

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!

+0

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

+0

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. –

+0

Ich bearbeitet, so dass Sie sehen können, was ich gerade habe (ich habe viele andere Dinge vorher versucht) –

Antwort

1

Sie müssen nur ein Date-Objekt des Grenzdatum von Ihrem Server erstellen, wie Sie Javascript markiert, würde es so geschehen:

var time = new Date(); 

Dann fügen Sie, was Zeit, die Sie zu diesem Zeitpunkt Objekt benötigen , das ist die aktuelle Zeit.

Danach können Sie dieses Datum Objekt vergleichen mit Ihren Kunden Datum (Welche Ihren Server Zeitzone hat) (mit ihrer Zeitzone)

, die leicht mit Moment.js getan werden könnten:

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

Eigentlich ist diese könnte auch ohne Moment.js leicht gemacht werden, aber es liegt an Ihnen. Der einzige Trick besteht darin, Datumsangaben mit Zeitzonen zu vergleichen.

+0

Ich habe diese Methode ab Moment verwendet, aber das Problem ist, dass ich ein mehrsprachiges System brauche. Deshalb suche ich für den Countdown nach einem hh-mm-ss-Format. –

+0

Ich habe das bearbeitet, damit du sehen kannst, was ich gerade habe (ich habe schon viele andere Sachen ausprobiert) –

0

Wenn Sie einfach zu einer bestimmten Zeit heruntergezählt, die Sie nicht einmal die Zeit Wert auf ein Datum konvertieren müssen, können Sie einfach tun:

var millisecondsLeft = timeValue - new Date(); 

und das ist es. Wenn der Wert negativ ist, ist die Zeit, die durch den Zeitwert dargestellt wird, überschritten.

Wenn Sie den UTC-Zeitwert übergeben, auf den Sie zählen möchten, können Sie auf dem Host-System unter Verwendung von new Date(timeValue) ein entsprechendes Datum erstellen.

Bei Verwendung dieser Methode wird die Host-Zeitzone nur zum Anzeigen einer für den Benutzer lesbaren Zeichenfolge für die Ausgabe verwendet. Dies hat keine Auswirkungen auf den Zeitwert des Datums. Wenn Sie eine Methode wie toISOString verwenden, die immer GMT ist, dann sehen Sie auf allen Hosts genau die gleiche Zeit, unabhängig von ihrer Zeitzoneneinstellung.

Also, wenn Sie wollen am 25. Mai zu, sagen sie, Mittag rückwärts zu zählen, 2016 für ein bestimmtes System dann ein Datum auf dem System erstellen und seine Zeitwert erhalten:

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

nun auf einem anderen System Sie tun können:

var date = new Date(timeValue); 

und Sie ein Datum für genau den gleichen Zeitpunkt (vorausgesetzt ZeitWert ist eine Zahl, kein String) erhalten.

Es ist auch einfach, einen Zeitwert für eine Zeit in einer beliebigen Zeitzone zu erstellen, indem Sie einfach den entsprechenden Offset entweder auf den Zeitwert oder auf das Datumsobjekt anwenden (mit UTC-Methoden), bevor Sie den Zeitwert erhalten.

+0

habe ich bearbeitet damit du sehen kannst was ich gerade habe (habe vorher schon viele andere Sachen ausprobiert) –