• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

brak zmiany czasu mimo odświeżania zegara w js

0 głosów
72 wizyt
pytanie zadane 13 lutego w JavaScript, jQuery, AJAX przez Marchiew Gaduła (4,050 p.)

Cześć,

Napisałem kiedyś taki zegar w js:

var czas = new Date().getTime()-(<?php echo time(); ?>*1000);

function odliczanie()
{
	var dzisiaj= new Date();

        dzisiaj.setTime(dzisiaj.getTime()-czas);

	var rok = dzisiaj.getFullYear();

	var dzien = dzisiaj.getDate();
		if(dzien<10) dzien= "0"+dzien;

	var miesiac = dzisiaj.getMonth()+1;
		if(miesiac<10) miesiac = "0"+miesiac;

	var godzina = dzisiaj.getHours();
		if (godzina<10) godzina = "0"+godzina;

	var minuta = dzisiaj.getMinutes();
		if (minuta<10) minuta = "0"+minuta;

	var sekunda = dzisiaj.getSeconds();
		if (sekunda<10) sekunda = "0"+sekunda;

	$("#godzina span").html("<b style='font-size: 30px;'>"+godzina+":"+minuta+":"+sekunda+"</b> <br>"+dzien+"-"+miesiac+"-"+rok);

	setTimeout("odliczanie()",1000);
}

Postanowiłem go odświeżyć na... lepiej napisany? i coś mi nie wychodzi.

        (function(w, d) {

            const corr = (j) => {
                if (j < 10) return "0" + j;
                else return j;
            }

            const getDate = () => {
                return new Date();
            }

            const getNowTime = () => {
                return getDate().getTime() - (<?= time(); ?> * 1000);
            }

            const nowTime = (p) => {
                const now = getDate();
                now.setTime(now.getTime() - getNowTime());

                switch (p) {
                    case "h":
                        return corr(now.getHours());
                        break;

                    case "m":
                        return corr(now.getMinutes());
                        break;

                    case "s":
                        return corr(now.getSeconds());
                        break;
                }
            }

            const viewHour = () => {
                d.getElementById("h").innerHTML = nowTime("h");

                setTimeout( () => {
                    viewHour();
                }, 1000 * 60 * 60);
            }

            const viewMinute = () => {
                d.getElementById("m").innerHTML = nowTime("m");

                setTimeout( () => {
                    viewMinute();
                }, 1000 * 60);
            }

            const viewSecond = () => {
                d.getElementById("s").innerHTML = nowTime("s");

                setTimeout( () => {
                    viewSecond();
                }, 1000);
            }

            viewHour();
            viewMinute();
            viewSecond();

        })(window, document);

Działa wszystko poza odświeżaniem się wyświetlanego czasu. Skrypt się odświeża co podany czas, ale nie wyświetlający się czas. Któryś raz podchodzę do poprawy kodu, ale za każdym razem ten sam problem i wyczerpały mi się już pomysły.

Z góry dzięki za pomoc.

2 odpowiedzi

0 głosów
odpowiedź 13 lutego przez Ignobiles Początkujący (420 p.)
Wydaje mi się że kod PHP w środku kodu JS nie ma prawa działać.
komentarz 13 lutego przez Marchiew Gaduła (4,050 p.)
Wydaje Ci się w takim razie, bo napisałem, że wszystko działa tylko jest coś nie tak z wyświetleniem aktualnego czasu. Pobiera czas np. 17:53:28, wyświetla go, odświeża sekundy co sekundę, ale 17:53:28 jest widoczna cały czas i w tym jest problem.
0 głosów
odpowiedź 13 lutego przez thryndl Mądrala (6,640 p.)

Działa wszystko poza odświeżaniem się wyświetlanego czasu

Bo używasz do tego setTimeout(), czyli krótko mówiąc, "odpalasz" funkcje raz po czasie przekazanym jako argument. 

Żeby systematycznie, co dany odcinek czasu funkcja była wywoływana, należałoby użyć do tego setInterval().

Najprostszy przykład, odpal konsole i wklej ten kod:

let sec = 0;

function timer() {
	sec += 1;

	console.log(sec);
}

setInterval(timer, 1000);

 

komentarz 13 lutego przez Marchiew Gaduła (4,050 p.)
Pobiera czas np. 17:53:28, wyświetla go, odświeża sekundy co sekundę, minuty co minutę, godziny co godzinę, ale 17:53:28 jest widoczna cały czas i w tym jest problem.
komentarz 13 lutego przez thryndl Mądrala (6,640 p.)
A jak ponownie wywolasz jedną z tych funkcji, np viewSeconds to wyswietli zaktualizowany czas? Skoro timer działa to obstawiam ustawienie setInterval na funkcję wyświetlająca czas, bo one sa wywoływane tylko raz na końcu skryptu.
komentarz 13 lutego przez Marchiew Gaduła (4,050 p.)

Znalazłem problem. Jest nim linijka 18

now.setTime(now.getTime() - getNowTime());

przez którą czas się nie zmienia. Wyłapuje np. 20:07:12 i ten czas jest cały czas odświeżany.
Nie mam pojęcia jak to naprawić.

komentarz 14 lutego przez thryndl Mądrala (6,640 p.)

Do metody setTime przekazuje się jako argument liczbę milisekund od 1 stycznia 1970 roku, więc wystarczy tam przekazać samą metodę getTime(), która zwraca tę liczbę. To odejmowanie jest zbędne.

now.setTime(now.getTime());

za komentowałem u siebie tę metodę 

// const getNowTime = () => {
    //     return getDate().getTime() - (<?= time(); ?> * 1000);
    // }

 

komentarz 14 lutego przez Marchiew Gaduła (4,050 p.)

Odejmowanie jest jak najbardziej na miejscu lecz ta 18 linijka nie zmienia wartości tej liczby sekund lub jest w ogóle ignorowana przez dalszy kod i bierze pod uwagę tylko linię 17 jakby osiemnasta nie istniała. Nie mam pojęcia jak się odwołać do nowo utworzonej daty w 18 linijce. Na MDN nie ma na ten temat ani słowa oprócz ustawienia jej... masz jakiś pomysł?

Podobne pytania

0 głosów
1 odpowiedź 40 wizyt
pytanie zadane 19 maja 2017 w JavaScript, jQuery, AJAX przez Hubert Synowiec Nowicjusz (200 p.)
0 głosów
1 odpowiedź 104 wizyt
pytanie zadane 9 stycznia 2016 w JavaScript, jQuery, AJAX przez demotywatorking Obywatel (1,210 p.)
0 głosów
4 odpowiedzi 201 wizyt
Porady nie od parady
Odznacz odpowiedź zieloną fajką, jeśli uważasz, że jest ona najlepsza ze wszystkich i umożliwiła ci rozwiązanie problemu.
Ciekawy innych porad? Odwiedź tę stronę!

45,876 zapytań

86,346 odpowiedzi

172,636 komentarzy

22,284 pasjonatów

Przeglądających: 50
Pasjonatów: 1 Gości: 49

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...