Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [Java][PHP]Zegarek
Forum PHP.pl > Forum > Przedszkole
cdhexx
Witam,
mam pytanie czy jest możliwość zrobienia zegarka, który normalnie działa jak systemowy zegarek czyli odlicza sekundy, minuty, godziny, ale nie potrzebuje do tego naszego zegarka systemowego bo date ciągnie z serwera. Chciałbym przez to osiągnąc zegarek, który ma gdzieś urzytkownika i jego komputer bo potrzebuje do swojego działania tylko serwer smile.gif

Liczę na pomoc smile.gif

Z góry dziękuję i pozdrawiam,
Bartek.
Kszyhuu
Weź zwykły zegarek z JS:
  1. <script language="javascript">
  2. var timerID = null;
  3. var timerRunning = false;
  4. function stopclock()
  5. {
  6. if(timerRunning)
  7. clearTimeout(timerID)
  8. timerRunning = false;
  9. }
  10.  
  11. function startclock()
  12. {
  13. stopclock();
  14. showtime();
  15. }
  16.  
  17. function showtime()
  18. {
  19. var now = new Date();
  20. var hours = now.getHours();
  21. var minutes = now.getMinutes();
  22. var seconds = now.getSeconds();
  23. var timeValue = "" + ((hours > 12) ? hours - 12 : hours);
  24. timeValue += ((minutes < 10) ? ":0" : ":") + minutes;
  25. timeValue += ((seconds < 10) ? ":0" : ":") + seconds;
  26. timeValue += (hours >= 12) ? " P.M." : " A.M.";
  27. document.clock.face.value = timeValue;
  28. timerID = setTimeout("showtime()",1000);
  29. timerRunning = true;
  30. }
  31.  
  32.  
  33. <form name="clock" onSubmit="0">
  34. <input type="text" name="face" size="24">
  35. </form>
  36.  
  37. <script>startclock();</script>

Później liczysz różnicę miedzy serwerem (echo) a klientem (now.Get*). Następnie odczytujesz przez JS czas u klienta i korygujesz wcześniej obliczoną różnicą.
cdhexx
o.O No raczej tego nie zrobie tongue.gif Mam takie skrypty java, ale one działają tylko z komputerem... Gdybym wiedział jak to zrobić to bym tutaj nie pisał. Dziękuję za chęć wykazania pomocy, jednak jak mówiłem nie zrobie tego ponieważ nie jestem dobry w Javie :/
maxil
masz przerób to sobie:

  1. <HEAD>
  2. <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-2">
  3. <script LANGUAGE= "JavaScript" type= "text/javascript">
  4. <!-- Ukrycie przed przeglądarkami nie obsługującymi JavaScriptów
  5. var timerID = null
  6. function wyswietlCzas()
  7. {
  8. var data = new Date();
  9. var godziny = data.getHours();
  10. var minuty = data.getMinutes();
  11. var sekundy = data.getSeconds();
  12. var czas = godziny;
  13. czas += ((minuty < 10) ? ":0" : ":") + minuty;
  14. czas += ((sekundy < 10) ? ":0" : ":") + sekundy;
  15. czas = "<B>" + czas + "</B>"
  16. document.getElementById("zegarLayer").innerHTML = czas;
  17. timerID = setTimeout("wyswietlCzas()",1000);
  18. }
  19. // Koniec kodu JavaScript -->
  20. </SCRIPT>
  21. </HEAD>
  22. <BODY onLoad="wyswietlCzas()">
  23. <DIV
  24. ID="zegarLayer"
  25. STYLE="
  26. visibility: visible;
  27. color: red;
  28. position: absolute;
  29. top: 20;
  30. left: 20;"
  31. >
  32. </DIV>
  33. Tutaj znajduje się treść strony
  34. </BODY>
  35. </HTML>


zegarek odlicza czas na warstwie div a nie w polu input i powinien działać zgodnie z czasem serwera
cdhexx
No niestety... kolejny skrypt, który ciągnie godzinę z mojego komputera sad.gif Ale także dziękuję za chęć pomocy. Może ktos inny powie jak to zrobić? sad.gif
maxil
Cytat(cdhexx @ 1.12.2009, 08:36:47 ) *
No niestety... kolejny skrypt, który ciągnie godzinę z mojego komputera sad.gif Ale także dziękuję za chęć pomocy. Może ktos inny powie jak to zrobić? sad.gif


a skąd wiesz że cięgnie dane z twojego komputera?
a jak przestawisz zegarek na komputerze to na stronie też się zmienia?
skowron-line
[JAVASCRIPT] pobierz, plaintext
  1. <body onload="nakrec_zegar( "<?php echo date( 'd.m.Y H:i:s' ); ?>" );">
[JAVASCRIPT] pobierz, plaintext

tak sobie przekazujesz czas serwera do skryptu JS a w nim już sobie obrabiasz date i czas.
a później Date() jedziemy z koksem.
cdhexx
Skąd wiem? A z tąd iż wgrałem skrypt na swój serwer i zmieniałem godzine na moim komputerze smile.gif Co do propozycji pana z ostatniego postu to już mam zupełny mętlik :/
skowron-line
Cytat(cdhexx @ 1.12.2009, 12:55:29 ) *
Skąd wiem? A z tąd iż wgrałem skrypt na swój serwer i zmieniałem godzine na moim komputerze smile.gif Co do propozycji pana z ostatniego postu to już mam zupełny mętlik :/


To jak już się na pan zwracamy do siebie to drogi panie. PHP działa po stronie serwera czyli pobiera czas z serwera, JS działa po stronie przeglądarki i pobiera sobie czas z lokalnej maszyny. w moim poście chodzi o podanie do funkcji wyświetlającej zegar parametrów daty i czasu poprzez php.

Oczywiście jeżeli będziesz sobie testował to na localhoscie to oczywiście nie wypali bo twój komputer jest serwerem.
cdhexx
Ok jednak widzę, że jak sama nazwa wskazuję jest to "przedszkole". Trudno, że nikt mi nie pomógł osiągnąć taki efekt jaki oczekiwałem.
Pozdarawiam.
Quantum
przecież skowron-line, podał Ci na tacy co musisz zrobić, żeby osiągnąć zamierzony efekt. Z czym masz problem ? Wystarczy, że zajrzysz na w3schools z linku z tego posta i znajdziesz tylko odpowiednie metody, którymi zmienisz pobrany z twego PC czas na ten z serwera.
cdhexx
Ja nie wiem jak za to się zabrać. Pisałem przecież, że nie umiem Javy ;/ Dlatego takie pisanie... zrób to, zrób tam to nic mi nie daje ;/
Spirit86
Cytat(cdhexx @ 1.12.2009, 19:22:54 ) *
Ja nie wiem jak za to się zabrać. Pisałem przecież, że nie umiem Javy ;/ Dlatego takie pisanie... zrób to, zrób tam to nic mi nie daje ;/


po pierwsze to jest javascript po drugie, to myślisz, że ktoś Ci tu gotowca napisze, żebyś mógł sobie to podpiąć, no może lepiej, żebyś mógł to sprzedać dalej? ;>
cdhexx
Hm, nie wiem skoro takie zdanie masz o kimś kogo nie znasz to proszę lepiej zastanowić się nad sobą, bo zazwyczaj zdanie o innych nabywa się analizując swoje zachowanie smile.gif

Koniec off topu.

Pozdrawiam.
maxil
Cytat(cdhexx @ 1.12.2009, 18:23:52 ) *
Ok jednak widzę, że jak sama nazwa wskazuję jest to "przedszkole". Trudno, że nikt mi nie pomógł osiągnąć taki efekt jaki oczekiwałem.
Pozdarawiam.


że forum nazywa się przedszkole to nie znaczy że, ktoś będzie za ciebie skrypt pisał. My tylko pomagamy ci napisać.
Miałeś jasno opisane jak to zrobić, ale jak już nie skorzystałeś to już twój problem
cdhexx
No, ale kiedy zedytuje ten kodzik i dodam np: <?php echo date( 'i' ); ?> to mi się nie kręcą minuty ;/
skowron-line
Cytat(cdhexx @ 2.12.2009, 00:24:53 ) *
No, ale kiedy zedytuje ten kodzik i dodam np: <?php echo date( 'i' ); ?> to mi się nie kręcą minuty ;/


No i już prawie jesteśmy w domu. Kolegom chodzi o to że nie pokazujesz do czego sam doszedłeś, pokaż kawałek kodu a napewno ktoś napisze w której linii i co trzeba zmienić aby wszystko działało tak jako sobie to wyśniłeś. A to że nie umiesz javascriptu nie znaczy że przy pisaniu tego skryptu nie możesz się podszkolić.
thomson89
a plik zapisałeś z rozszerzeniem .php?
odpalasz go na kompie poprzez serwer obsługujący php / jest na serwerze obsługującym php?
cdhexx
Hm oto część kodu:
  1. <script LANGUAGE= "JavaScript" type= "text/javascript">
  2. <!-- Ukrycie przed przeglądarkami nie obsługującymi JavaScriptów
  3. var timerID = null
  4. function wyswietlCzas()
  5. {
  6. var data = new Date();
  7. var godziny = data.getHours();
  8. var minuty = data.getMinutes( "<?php echo date( 'i' ); ?>" );
  9. var sekundy = data.getSeconds();
  10. var czas = godziny;
  11. czas += ((minuty < 10) ? ":0" : ":") + minuty;
  12. czas += ((sekundy < 10) ? ":0" : ":") + sekundy;
  13. czas = "<B>" + czas + "</B>"
  14. document.getElementById("zegarLayer").innerHTML = czas;
  15. timerID = setTimeout("wyswietlCzas()",1000);
  16. }
  17. // Koniec kodu JavaScript -->
  18. </SCRIPT>


Zapisywałem na serwerze, no działa poprawnie tzn. minuty bo reszte dorobie analogicznie później. Tylko teraz zegarek stoi w miejscu, a dokładniej minuty sad.gif
zegarek84
luknij na to - obliczone przesunięcie czasu w milisekundach i wg. tego wyświetlony czas z wartości zegara lokalnego - nie sprawdzałem czy się nie pomyliłem ale już nieraz robiłem podobny myk jeśli komuś w useurscript pisałem jakieś mini boty na szybko do gier:
[JAVASCRIPT] pobierz, plaintext
  1. var timerID = null , dif = (new Date(<?php echo floor(microtime(true)*1000);?>)).getTime() - (new Date()).getTime();
  2. function wyswietlCzas()
  3. {
  4. var data = new Date((new Date()).getTime() + dif);
  5. var godziny = data.getHours();
  6. var minuty = data.getMinutes();
  7. var sekundy = data.getSeconds();
  8. var czas = godziny;
  9. czas += ((minuty < 10) ? ":0" : ":") + minuty;
  10. czas += ((sekundy < 10) ? ":0" : ":") + sekundy;
  11. czas = "<B>" + czas + "</B>"
  12. document.getElementById("zegarLayer").innerHTML = czas;
  13. timerID = setTimeout("wyswietlCzas()",1000); /* ps. w js mało piszę ale skoro parametrów nie przekazujesz to o ile dobrze pamiętam wystarczyło setTimeout(wyswietlCzas,1000) ;) */
  14. }
[JAVASCRIPT] pobierz, plaintext
cdhexx
Wszystko, pięknie i ładnie ale nadal kożysta z zegarka systemowego no i wyświetla nieprawidłową godzinę:( Nie mam pojęcia co zrobić sad.gif
zegarek84
nie zupełnie korzysta z zegarka systemowego ;p - i co do godziny to wyświetl sobie jeszcze godzinę czasu serwera - tak to jest jeśli nie uwzględnisz różnicy strefowej ;p/ czasu strefowego

luknij na algorytm jak to działa - czas z serwera przeliczony do milisekund i obliczona różnica w milisekundach z czasu lokalnego - potem w funkcji wyświetlającej czas jako parametr podaję liczbę milisekund jaka powinna być na serwerze:
(new Date()).getTime() + dif
gdzie (new Date()).getTime() to liczba milisekund czasu aktualnego - jakby nie było z tego co napisałeś wszystko działa ok - wyświetl sobie gdzieś statyczną datę i godzinę na serwerze i porównaj z tym zegarkiem - musisz dorzucić różnicę czasu strefowego

JS zawsze korzysta z zegarka systemowego!!! - teraz kwestia przeliczenia tego czasu - jak już pisałem na serwerze masz inną godzinę niż w Warszawie ;p

na początku skryptu php użyj funkcji:
  1. date_default_timezone_set('Europe/Warsaw');

Cytat(cdhexx @ 3.12.2009, 14:27:53 ) *
...no i wyświetla nieprawidłową godzinę:( Nie mam pojęcia co zrobić sad.gif

wyświetla taką jaką chciałeś ;p - godzinę na serwerze ;p
cdhexx
No to sam kuknij http://lockerz-poland.com/1.php
Co odświeżenie wyświetla 1:00:00 i tak w kólko po odświeżeniu :/

A kiedy przesunke zegarek systemowy to godzina na stronie też się przesówa :/
zegarek84
sorki - dzisiaj odwiedzam rodzinkę i jestem deczko "podchmielony" - którą wersję php masz?? poniżej 5??
Changelog/komentarz/uwaga
zerknąłem w źródło i to co jest zwracane do Twojego skryptu nie odpowiada temu: <?php echo floor(microtime(true)*1000);?> - jak pomagałem nie testowałem skryptu js ale szybko to akurat sprawdziłem i zwracało poprawną wartość 13-to cyfrową... jak patrzę u Ciebie w źródla to wartość zwracana jest 3 cyfrowa tylko...

jeśli urzywasz php w starszej wersji niż 5 to luknij w komentarze funkcji microtime a dokładniej:
A hack for PHP < 5.0 - tyle, że użyj echo a nie print - powinno pomóc...

zresztą dla pewności pokaż kod php i podaj wersję php gdyż w algorytmie js który podałem na szybko (był podany a deczko zmodyfikowałem winksmiley.jpg) nie widzę błędu...
pozdro winksmiley.jpg - sorki, że nie na pw i tak późno ale raz, że komuś może się to przydać, a 2 to byłem i jestem deczko zajęty winksmiley.jpg
cdhexx
Kod jest identyczny jak mi podałeś. A co do wersji php to nie mam szczerze pojęcia. Ale hosting mam na webd.pl pakiet large :] Czyli co mam zrobić ?

P.S.

Mam Wersja PHP 4.4.9
Quantum
[JAVASCRIPT] pobierz, plaintext
  1. function clock()
  2. {
  3. var timestamp = document.getElementById("timestamp");
  4. var time = document.getElementById("time");
  5. var new_time = parseInt(timestamp.innerHTML)+1;
  6. var date = new Date(new_time * 1000);
  7. var output = date.getHours();
  8. output += ((date.getMinutes() < 10) ? ":0" : ":") + date.getMinutes();
  9. output += ((date.getSeconds() < 10) ? ":0" : ":") + date.getSeconds();
  10. timestamp.innerHTML = new_time;
  11. time.innerHTML = "<b>" + output + "</b>";
  12. }
  13.  
  14. setInterval('clock()', 1000);
[JAVASCRIPT] pobierz, plaintext


  1. echo '<div id="timestamp" style="display:none;"></div>
  2. <div id="time">'.time().'</div>';


sprawdź to.
zegarek84
@cdhexx - pytałem się o zawartość pliku php - ja podałem "fragment" (niby całość ale nie wiem jak żeś to w php wplótł)... pozatym co do wersji php phpinfo...

@sniffer32 - podałeś identyczne rozwiązanie jak ja wyżej pomijając tylko milisekundy (gdzie to że je dałem trochu poprawia wynik zwłaszcza jak się pisze pseudo boty które mają klikać w idealnie policzonym czasie ;p) - czyli użyłeś tylko funkcji time zamiast microtime + dodatkowo drobny błąd w logice funkcji gdyż założę się, że po 15min co najmniej a już na pewno po 30min na stronie czas będzie inny niż serwerowy mimo wykonywania funkcji co sekundę i dodawania sekundy do ogólnego czasu (dochodzą jeszcze różne opóźnienia powodujące późniejsze wykonanie funkcji (minimalnie ale jednak ;p) - a mając jako wzorzec zegar systemowy + różnicę ma się lepszy wzorzec czasu winksmiley.jpg - co do tego wzorca to taki mały przykład jak np. grając dawniej w pewną gierkę nie miałem dokładnie czasu milisekund a były one niestety potrzebne do pewnych operacji, godzina była na stronie podawana co prawda ale z dokładnością do sekund niestety... w dodatku czasem dochodziły opóźnienia wczytania strony (co tez mogło się zdarzyć przy kliknięciu automatycznym z poziomu pseudo bota ale czas trzeba było minimalizować a nie można było od kliknąć za w czasu) - więc ustawiało się na skrypcie różnicę "doświadczalnie" i wzorzec był już idealny - niestety w tej gierce na serwie była też przerwa w godzinach najczęściej od 4:30 do 5:00 i czasy nieznacznie się różniły więc "wzorzec" trzeba było ustawiać co dzień - oczywiście też wykorzystywało się tą przerwę licząc czasy ataków tak, by wróg jeśli coś poważnego miał robić miał to właśnie zrobić w czasie przerwy serwera (czyli gdy nic nie mógł zrobić ^^) - w ten sposób można było toczyć walki z "mocnymi" zawodnikami w okolicy oddalonymi nawet o 25h drogi ^^ - a mnie lame zawsze interesowały wiochy co mają najwięcej pkt w okolicy (niestety zawsze grałem krótko z braku czasu ;/)
cdhexx
Skopiowałem identycznie jak jest i wyświetla takie coś http://www.lockerz-poland.com/1.php
zegarek84
człowieku - zacznij kopiować z głową - rozwiązanie już dawno w sumie miałeś na tacy...

ok - wklej poniższą zawartość bez myślenia tym razem a dopiero pomyślisz jak będziesz chciał zaimplementować:
  1. <?php
  2. date_default_timezone_set('Europe/Warsaw');
  3. function militime(){
  4. $time = explode(' ',microtime(),2);
  5. return floor(($time[1]+$time[0])*1000);
  6. };?><HTML>
  7. <HEAD>
  8. <script>
  9. var $timerID = null , $dif = (new Date(<?php echo militime();?>)).getTime() - (new Date()).getTime();
  10. function wyswietlCzas()
  11. {
  12. var $data = new Date((new Date()).getTime() + $dif),
  13. $godziny = $data.getHours(),
  14. $minuty = $data.getMinutes(),
  15. $sekundy = $data.getSeconds(),
  16. $czas = ['<b>', $godziny, ':', ($minuty<10)?'0'.concat($minuty):$minuty, ':', ($sekundy<10)?'0'.concat($sekundy):$sekundy, '</b>'].join('');
  17. document.getElementById("zegarLayer").innerHTML = $czas;
  18. $timerID = setTimeout(wyswietlCzas,1000);
  19. }
  20. window.onload=wyswietlCzas;
  21. </script>
  22. </HEAD>
  23. <BODY>
  24. <DIV ID="zegarLayer" STYLE="visibility:visible;color:red;position:absolute;top:20;left: 20;">
  25. </DIV>
  26. </BODY>
  27. </HTML><?php exit;?>

ps.
zamiast zdefiniowanej funkcji militime w php możesz użyć/zastąpić ją przez time()*1000
cdhexx
Wielkie dzięki smile.gif Wszystko działa jak trzeba smile.gif

Jeszcze jedno, a co bym musiał z edytować aby wyświetlało czas w AM i PM bo chce wprowadzić jeszcze drugi zegarek wyświetlający godzinę w USA?

Mniej więcej tak to u mnie wygląda jak odejmę te 6 godzin http://www.lockerz-poland.com/time.php
zegarek84
trochu to teraz "dziwnie" wygląda [ujemna godzina ]
luknij w kodzie na: (new Date()).getTime() + $dif - poszukaj gdzie to jest - tutaj masz obliczoną liczbę milisekund od "since the Unix Epoch (January 1 1970 00:00:00 GMT)" - tak więc dla Polski teraz masz poprawną wartość - jeśli Polska jest punktem odniesienia to rozumowanie Twoje idzie w dobrym kierunku ale....

aby to uporządkować policz tą wartość dla Polski
$pl = (new Date()).getTime() + $dif;
no i od tego odejmij te 6h - ale pomyśl jak ;p - pisałem , że tamto jest w milisekundach - więc:
$en = $pl - 6*60*60*1000;

no a teraz pasowało by mieć 2 różne daty czyli:
$data_pl = new Date($pl);
$data_en = new Date($en);
i analogicznie z godzinami itd... $godzina_pl... $godzina_en...
co do wyświetlania AM i PM sprawdzasz czy godziny >12 czy nie i jak pm to odejmujesz te 12 od wartości wyświetlanej godziny ...

lub jeszcze inaczej można puszczać funkcję z dodatkowym parametrem na przesunięcie i samo by liczyło - ale spróbuj pomyśleć trochu i przerobić to co masz - prędzej się nauczysz - już gotowca dostałeś i teraz dostosować go tylko musisz...

...co prawda mógłbym napisać gotową funkcję ale nie od tego jest to forum żeby dawać gotowce - na tym forum pomagamy - powyższy "gotowiec" otrzymałeś choć wszystko wcześniej napisalem jak na tacy co i do czego ale też pisałem, że musisz już sam cały kod dostosować...

pozdro
cdhexx
OKi zrobiłem te przesunięcie czasu o sześć godzin w tył http://www.lockerz-poland.com/time.php ale nadal jest problem z wykonaniem tego AM i PM, bo to nie tylko musi wyświetlać AM i PM ale zamienić czas na format amerykański czyli dwunastogodzinny. Próbowałem użyć warunku ale coś mi nie wyszło sad.gif Jakieś wskazówki ?

P.S.
jeszcze jedno ponieważ iż forum MyBB nie obsługuje php (jeżeli chodzi o edycje skryptu przez panel administracyjny), a chciałem zamieścić tam mój skrypt. Jest jakaś możliwość umieszczenia tam tego skryptu pomijając rameczki?

OK z godziną sobie poradziłem x) Teraz tylko to pytanie z P.S.'a proszę o szybką odpowiedź bo chce już skrypt umieścić smile.gif

OK temat zamknięty już wszystko zrobiłem smile.gif
Dziękuję za pomoc i pozdrawiam serdecznie smile.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.