2012-01-10 16 views
10

Mam timer odliczający javascript, który działa przez podjęcie określonej daty i czasu, i porównanie go do bieżącej daty i czasu. Problem polega na tym, że aktualny czas jest związany ze strefą czasową użytkowników, więc pozostały czas jest różny dla różnych użytkowników.Odliczanie JavaScript przy użyciu strefy czasowej absolutnej?

Jak mogę odliczać czas do czasu w konkretnej strefie czasowej, w moim przypadku GMT -5 godzin?

Rozumiem, że mogę skorzystać z poniższego kodu, aby uzyskać strefę czasową użytkowników, ale jestem zagubiony, jak z tego korzystać.

myDateObj.getTimezoneOffset()/60

+0

http://countdownjs.org – mckamey

Odpowiedz

6

Szybkie wyszukiwanie ujawnia: convert-the-local-time-to-another-time-zone-with-this-javascript

Po artykuł verbatim dostaje ten przykład:

var d = new Date(); 

var localTime = d.getTime(); 

var localOffset = d.getTimezoneOffset() * 60000; 

var utc = localTime + localOffset; 

// obtain and add destination's UTC time offset 
// for example, Bombay 
// which is UTC + 5.5 hours 
var offset = 5.5; 
var bombay = utc + (3600000*offset); 

var nd = new Date(bombay); 
alert("Bombay time is " + nd.toLocaleString() + "<br>"); 

jsFiddle: http://jsfiddle.net/GEpaH/

Po prostu pdate z pożądanym przesunięciem i powinieneś być ustawiony.

0

Naprawdę nie mówisz dokładnie, co próbujesz osiągnąć. Obiekt daty javascript pobiera czas lokalny i "przesunięcie strefy czasowej" (w stosunku do GMT (UTC)). Są one oczywiście "ustawione" przez użytkownika, więc nawet jeśli w tej samej strefie czasowej, dwóch użytkowników jest bardzo mało prawdopodobne, aby mieli ten sam "czas".

Jeśli próbujesz zmierzyć czas między różnymi użytkownikami, powinieneś odwoływać się do niektórych scentralizowanych uprawnień czasowych.

Chciałbym użyć wywołania typu AJAX (XMLHttpRequest) do strony własnego serwera, który zwraca mój czas serwera. W ten sposób każdy użytkownik odwołuje się do tego samego czasu.

Google XMLHttpRequest, aby znaleźć przykłady kodu JS, którego potrzebujesz (i często odpowiadający kod po stronie serwera dla prostej usługi, takiej jak ta).

PS: Zainstalowałbym również proste oprogramowanie klienckie, aby zachować dokładność czasu na moim serwerze poprzez synchronizację z zegarem atomowym co 10 minut.

5

Można użyć Date.UTC(year,month,day,hours,minutes,seconds,msec)

To działa podobnie jak data konstruktora, ale zwraca znacznik czasu argumentów na czas Greenwich (offset = 0) zamiast czasu lokalnego.

var localtime=new Date(Date.UTC(year,month,day,hours,minutes,seconds,msec)) 

zwraca lokalny czas dla określonego czasu UTC.

Wszyscy (których zegar jest ustawiony prawidłowo) zakończą odliczanie razem.

0

Nie można uzyskać dokładnej daty z JavaScriptem, ponieważ jest on po stronie klienta i jest oparty na zegarze systemu operacyjnego użytkownika. Możesz użyć jCounter, aby wyświetlić odliczanie na podstawie stref czasowych po stronie serwera.

Ale hej, jeśli naprawdę chcesz zrobić to sam, pobierz jCounter, a znajdziesz datę i godzinę.również plik php, który pobiera aktualną datę po stronie serwera, jako znacznik czasu (będzie musiał być umieszczony na serwerze btw, nie na pulpicie: P)

Sprawdź, w jaki sposób skrypt wykorzystuje ten plik i pobiera rzeczywisty prąd data działania przeciwko niemu i obliczenie dokładnych odliczeń.

Cheers

1

Wystarczy utworzyć na bieżąco z RFC 2822-timestamp ze strefy czasowej. Ten czas zostanie następnie przekonwertowany na aktualną lokalizację użytkowników (na podstawie ustawień systemu operacyjnego). Nawet z poprawkami dla daylight savings time!

Jestem w Norwegii, która obecnie jest w okresie letnim, więc jest to GMT + 2. Oto co się dzieje, gdy tworzę obiekt Date przy użyciu GMT-0500:

var myDateObj = new Date("Fri Apr 17 2015 12:00:00 GMT-0500 (CDT)"); 
myDateObj.toString(); 

Pią Kwi 17 2015 19:00:00 GMT + 0200 (CEST)

Jak uzyskać prawidłowe ciąg daty dla Twojej lokalizacji? Jeśli jest to strefa czasowa, w której aktualnie się znajdujesz; po prostu wykonaj myDateObj.toString() w przeglądarce dev-tools console. Dla innej strefy czasowej; najpierw zmień strefę czasową w systemie operacyjnym. (Or read the RFC)

new Date().toString(); 

piątek 17 kwietnia 2015 12:36:57 GMT + 0200 (CEST)

+0

"Uwaga: analizowanie ciągów dat za pomocą konstruktora Date (i Date.parse, są one równoważne) jest zdecydowanie odradzane ze względu na różnice i niespójności w przeglądarkach." - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date – Fabian

0

zrewidować podejście Brandon podjęła, aby obliczyć czas UTC przesunięty, możemy szczupła kod dół do przedłużenia dwóch linii obiektu Date:

/* getOffsetDate - Returns a Date shifted by a certain offset 
* @param offset the UTC offset to shift, in hours 
* @return new date object shifted by UTC offset 
*/ 
Date.prototype.getOffsetDate = function(offset) { 
    utc = this.getTime() + (this.getTimezoneOffset() * 60000); 
    return new Date(utc + (3600000*offset)); 
} 

można następnie obliczyć UTC-5 przesunął datę następująco:

myDate = new Date().getOffsetDate(-5); 

Należy zauważyć, że rozszerzanie rodzimych prototypów w ten sposób jest ogólnie uważane za złą praktykę, ponieważ mylone są podstawowe obiekty, od których zależą inne biblioteki. Aby to uzasadnić, musisz argumentować, że ta funkcja powinna być natywną częścią obiektu Date.

Powiązane problemy