Autor Zpráva
Brambora
Profil *
Živá ukázka

kod ukáže asi můj problém... nevede se mi získat správné počítání hodin...
nějak nevidím kde je chyba... i když "++c" ddělím zobrazuje to nesprávný čas
Serg
Profil
Podle toho, co je v ukázce, tak:

1) funkce uvnitř funkce nevypadá hezky
2) proměnná "c" s timestampem má nějak moc cifer (myslím že jedna nula je tam navíc)
3) k tomu to pak ještě po vynásobení 1000 při vytváření objektu Date z toho udělá asi nějaké desetiny mikrosekund, přitom Date chce argument v milisekundách, myslím
4) místo neustálého vytváření nových objektů Date by podle mě bylo efektivnější použít metodu setSeconds
d.setSeconds(d.getSeconds() + 10);

Nějak takle, ale nevím proč nefunguje zastavení intervalu :D
var c = 1589826348000; //20:25
var d = new Date(c);
var myTimer = false;

function clock() {
   myTimer = setInterval(myClock, 1000);
}

function myClock() {
    d.setSeconds(d.getSeconds() + 1);
    var h = d.getHours();
    var m = d.getMinutes();
    var s = d.getSeconds();
    document.getElementById("demo").innerHTML = (h + ":" + m + ":" + s);
}

function stop() {
    if (myTimer) {
        clearInterval(myTimer);
        myTimer = false;
    }
}

Případně pokud by bylo potřeba měnit hodnotu c, tak potom by to místo prvního řádku funkce myClock chtělo napsat něco jako:
c += 1000;
var d = new Date(c);
Brambora
Profil *
Serg:
2) proměnná "c" s timestampem má nějak moc cifer (myslím že jedna nula je tam navíc)
je to microtime ... počet nul je určitě správný :)


k tomu to pak ještě po vynásobení 1000 při vytváření objektu Date z toho udělá asi nějaké desetiny mikrosekund, přitom Date chce argument v milisekundách, myslím
počítá se c + 1 což je ale jedna milisekunda... aby jsem docílilo sekundy vynásobila jsem to 1000


Serg:
Nějak takle, ale nevím proč nefunguje zastavení intervalu :D
ale děkuji nakopl jsi měk správnému řešení :)
Serg
Profil
Brambora:
je to microtime
Bavíme se o čísle 15898263460000, že? V tom případě je to ale ve stovkách mikrosekund, nebo chybí 2 nuly, nebo je to v milisekundách a ukazuje to na rok 2473.
Po vydělení 10 by to bylo v milisekundách, a to je přesně to, co chce konstruktor objektu Date. (v jedné z jeho variant)

počítá se c + 1 což je ale jedna milisekunda... aby jsem docílilo sekundy vynásobila jsem to 1000
To by vypadalo asi nějak takle:
15898263460000 + 1 = 15898263460001
15898263460000 * 1000 = 15898263460001000
Ale jestli by to mělo přičíst jednu vteřinu, tak by to mělo dopadnout takle: 1589826347000

Takže je spíš potřeba přičíst 1000, nebo mít "c" v sekundách a pak to v konstruktoru vždy násobit 1000 aby z toho vznikly ms.
Radek9
Profil
Serg:
1) funkce uvnitř funkce nevypadá hezky
To je naprosto běžně používaný konstrukt, potřebuješ-li využít closure.

Brambora:
je to microtime ... počet nul je určitě správný :)
Pokud by se to rovnou předávalo do Date, tak by to měl být čas v milisekundách. 15898263460000 odpovídá roku 2473. 1589826346000 odpovídá roku 2020.

počítá se c + 1 což je ale jedna milisekunda... aby jsem docílilo sekundy vynásobila jsem to 1000
Buď měj c v milisekundách a přičítej 1000 (a už to nenásob), nebo to měj v sekundách (tzn. 1589826346) a přičítej 1 (a násob 1000). Mícháš dvě věci dohromady, takže ti to leze do šílených řádů.

Vaše odpověď

Mohlo by se hodit

Neumíte-li správně určit příčinu chyby, vkládejte odkazy na živé ukázky.
Užíváte-li nějakou cizí knihovnu, ukažte odpovídajícím, kde jste ji vzali.

Užitečné odkazy:

Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0