• 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

VPS Starter Arubacloud
0 głosów
825 wizyt
pytanie zadane 13 lutego 2018 w JavaScript przez Marchiew Dyskutant (7,690 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 2018 przez Ignobiles Obywatel (1,800 p.)
Wydaje mi się że kod PHP w środku kodu JS nie ma prawa działać.
komentarz 13 lutego 2018 przez Marchiew Dyskutant (7,690 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 2018 przez thryndl Nałogowiec (30,470 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 2018 przez Marchiew Dyskutant (7,690 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 2018 przez thryndl Nałogowiec (30,470 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 2018 przez Marchiew Dyskutant (7,690 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 2018 przez thryndl Nałogowiec (30,470 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 2018 przez Marchiew Dyskutant (7,690 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ź 109 wizyt
pytanie zadane 19 maja 2017 w JavaScript przez Hubert Synowiec Nowicjusz (200 p.)
0 głosów
1 odpowiedź 190 wizyt
pytanie zadane 9 stycznia 2016 w JavaScript przez demotywatorking Obywatel (1,210 p.)
0 głosów
1 odpowiedź 819 wizyt

92,452 zapytań

141,262 odpowiedzi

319,077 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

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

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...