• 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
80 wizyt
pytanie zadane 13 lutego w JavaScript, jQuery, AJAX przez Marchiew Mądrala (5,000 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 Mądrala (5,000 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 Dyskutant (9,380 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 Mądrala (5,000 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 Dyskutant (9,380 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 Mądrala (5,000 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 Dyskutant (9,380 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 Mądrala (5,000 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ź 106 wizyt
pytanie zadane 9 stycznia 2016 w JavaScript, jQuery, AJAX przez demotywatorking Obywatel (1,210 p.)
0 głosów
1 odpowiedź 115 wizyt
Oferty pracy dla początkujących programistów na portalu No Fluff Jobs
Porady nie od parady
Nie wiesz jak poprawnie zredagować pytanie lub pragniesz poznać którąś z funkcji forum? Odwiedź podstronę Pomoc (FAQ) dostępną w menu pod ikoną apteczki.FAQ

49,743 zapytań

91,700 odpowiedzi

185,224 komentarzy

24,203 pasjonatów

Przeglądających: 236
Pasjonatów: 13 Gości: 223

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.

...