[js] problem z synchronizacją czasu 3733 4

O temacie

Autor Tasilvar

Zaczęty 19.11.2010 roku

Wyświetleń 3733

Odpowiedzi 4

Tasilvar

Tasilvar

Użytkownicy
zwykły user
posty264
Propsy17
ProfesjaSkrypter
  • Użytkownicy
  • zwykły user
Witam. Otóż z czystej ciekawości (w sumie i też wolnego czasu :D ) starałem się zaprogramować swego rodzaju "licznik" który odliczałby dynamicznie ile pozostałoby czasu do danego zdarzenia. W sumie efekt osiągnąłem, tylko pojawił się niewielki problem. Otóż, jest problem z synchronizajcą wartości zmiennej sekundowej z tą od minut. W praktyce problem polega na tym, że kiedy skrypt odlicza sekundy {32,31,30...,0} to w momencie otrzymania wartości 30 automatycznie minuta spada o 1 w dół próbowałem jakoś "manualnie" zmniejszyć wartość zmiennej sekundowej żeby przy wartości 0 sec spadała minuta, jednak w ten sposób zmienna otrzymywała wartości ujemne co było paradoksalne ;/

Ale co tu dużo gadać, podsyłam kod skryptu i ew. przetestujcie.


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta http-equiv="Content-Script-Type" content="text/javascript" />
<title>Odliczanie czasu</title>
<script type="text/javascript">

/*
*  Odliczanie czasu
*   by Michał Jendraszczyk
*/

function online() {


var obecnaData = new Date(); // zmienna z obecna data
var godzinyFull = obecnaData.getHours();
var minutyFull = obecnaData.getMinutes();
var sekundyFull = obecnaData.getSeconds();
var stalaData = new Date(2010, 11, 22, 00, 00, 00); // tutaj mamy koncowa date /rok/miesiac-1/dzien/godz/min/sec

var wynik = stalaData - obecnaData;  // roznica w milisekundach

var dniFull = Math.round(wynik / (1000 * 60 * 60 * 24)); // zmienna dniFull ktora dzieli zmienna wynik przez ilosc milisekund w 1 dniu

var ileGodzin = wynik % (1000 * 60 * 60 * 24); //zmienna ileGodzin przechowująca wartość modulo z dzielenia zmiennej wynik przez ilosc milisekund w 1 dniu
godzinyFull = Math.round(ileGodzin / (1000 * 60 * 60)); //zmienna godzinyFull ktora nam liczy ile mamy godzin w reszcie modulo

var ileMinut = ileGodzin % (1000 * 60 * 60); // no i zmienna przechowujaca minuty ktora wylicza nam wartosc modulo ze zmiennej ileGodzin
minutyFull = Math.round(ileMinut / (1000 * 60)); // a nastepnie przeliczamy minuty poprzez podzielenie ich przez ilość milisekund w minucie

var ileSekund = ileMinut % (1000 * 60);  //wartosc modulo z zmiennej ileMinut
sekundyFull = Math.round(ileSekund / 1000); // no i przeliczenie zmienej ileSekund poprzez podzielenie przez 1000 milisekund


if (sekundyFull < 10)  // jezeli zmienna sekundyFull jest mniejsza od 10
sekundyFull = "0"+sekundyFull; // to dodaj 0 przed wartością
if(minutyFull < 10)  // no i jezeli zmienna minutyFull jest mniejsza od 10
minutyFull = "0"+minutyFull; // też dawaj 0 przed zmienna

document.zegar.czas.value = "Do kalendarzowej zimy pozostało: "+dniFull+" dni "+godzinyFull+"h "+minutyFull+"m "+sekundyFull+"s "; // odwoladnie do dokumentu, w ktorym formularz o nazwie zegar ma input o nazwie czas i jego wartosc zostaje uzupelniona o konkretne dane
setTimeout("online()",900); // funkcja setTimeout odpowiadajaca za dynamike zekarka

}

</script>
</head>
<body onload="online()">
<form name="zegar">
<input name="czas" type="text" style="width:100%;text-align:center;border-width:0px;font-family:arial;color:#d1d1d1;height:500px;font-size:24px;"/>
</form>
<noscript>
Twoja przeglądarka nie obsługuje JavaScriptu
</noscript>
</body>
</html>


Pozdrawiam ;)
 

Adanos

Adanos

Administrator
Szara eminencja
posty5204
Propsy3870
ProfesjaProgramista
  • Administrator
  • Szara eminencja
Nie możesz po prostu zamiast tegovar ileMinut = ileGodzin % (1000 * 60 * 60); // no i zmienna przechowujaca minuty ktora wylicza nam wartosc modulo ze zmiennej ileGodzin
         minutyFull = Math.round(ileMinut / (1000 * 60)); // a nastepnie przeliczamy minuty poprzez podzielenie ich przez ilość milisekund w minucie
       
dać:
        minutyFull = Math.round(wynik / 60000)%60; // a nastepnie przeliczamy minuty poprzez podzielenie ich przez ilość milisekund w minucie
       
?

Tasilvar

Tasilvar

Użytkownicy
zwykły user
posty264
Propsy17
ProfesjaSkrypter
  • Użytkownicy
  • zwykły user
znaczy się każdej z zmiennych miałbym przypisać wartości na mniej więcej taki sposób? w tym wypadku musiałbym zmodyfikować połowę kodu.
 

Adanos

Adanos

Administrator
Szara eminencja
posty5204
Propsy3870
ProfesjaProgramista
  • Administrator
  • Szara eminencja

Adanos
Administrator

[js] problem z synchronizacją czasu
#3 2010-11-19, 20:00(Ostatnia zmiana: 2010-11-19, 20:02)
Niby tak. Problemem jest funkcja math.round, która zaokrągla wynik i stąd masz problemy. Usuń z minut tą funkcję, to zobaczysz o co chodzi ;)

Użyj math.floor zamiast math.round.

Tasilvar

Tasilvar

Użytkownicy
zwykły user
posty264
Propsy17
ProfesjaSkrypter
  • Użytkownicy
  • zwykły user
aa, no tak ;) I o to właśnie chodziło ! :ok:   Dzięki Adanos ;) Problem rozwiązany :)
 


0 użytkowników i 1 Gość przegląda ten wątek.
0 użytkowników
Do góry