Minulla on tietokannassa tietoa, jossa on eri asioiden päättymisajat UNIX-timestamppina. Miten saisin koodin tulostamaan ne haluttuun kohtaan siten, että aikaa laskettaisiin alaspäin?
Minulla on väkerrelmä, jolla voin toteuttaa yhden laskurin. Laskuri toimii siten, että ensin se erottaa nykyisen ajan tietokannassa olevasta tulevaisuudessa sijaitsevasta ajasta, ja jakaa sitten aikoja jolloin syntyy tunnit, minuutit ja sekunit. Sitten tämä asettaa ne lohkoihin (tunnit, minuutit, sekunit). Miten saisin järkevämmin tulostettua vaikka kymmenen eri asian laskurit?
Tulostuksen pitäisi olla näin:
1. Asia1 loppuu xx:xx:xx päästä.
2. Asia2 loppuu xx:xx:xx päästä.
jne...
Taulukko:
tehtävan_id|tunnit|minuutut|sekunnit 1 |12 |54 |1 2 |7 |3 |24 3 |1 |24 |5 ... |... |... |...
tämä hetki - haluttu hetki sitten tulostaa näyttöön ja päivittyy
Häh? "tämä hetki - haluttu hetki" tuottaa negatiivisen luvun.
Voitko näyttää, en ihan ymmärtänyt mitä tarkoitat.
Jokotai taitaa selittää (taas!) ihan omiaan.
Osaat tulostaa yhden rivin, hienoa. Osaat siis varmaankin tulostaa myös monta rivin silmukalla. Mikä siis oikeastaan on ongelmasi? JS:llä tehtävä laskuriko (siitä kai viimeksi puhuttiin)?
Kuinka pitkiä aikoja lasket? Käykö funktio date_diff? Tietokannassa aika tietty samassa boxissa, ei jaettuna moneen kenttään.
Metabolix: En tiedä, miten antaisin PHP:n palauttaa JS:lle tiedot ja mihin ne tulostetaan.
Pekka Mansikka kirjoitti:
Kuinka pitkiä aikoja lasket? Käykö funktio date_diff? Tietokannassa aika tietty samassa boxissa, ei jaettuna moneen kenttään.
Aika on maksimissaan viikon päässä tulevaisuudessa.
Sitten tuo saattais käydä:
Pitänee varmaan kopsata toi funktio skripta sitä ei oo joka levyllä.
https://www.php.net/manual/en/function.date-diff.php
Tulostukseen voi tehdä merkkijonojen muutokset suomen kielelle. (str_replace)
Tulosta HTML:ään taulukollinen samanlaisia rivejä, joita ennen tulostit yhden. Aseta elementeille järkevät id-arvot, jotta ne on helppo löytää JS-koodissa.
foreach ($asiat as $id => $asia) { echo "<p>Asia $id ($asia) päättyy <span id='tunnit_$id'>?</span>...\n"; }
Tulosta JS:lle koko taulukollinen aikoja; aseta taulukon avaimiksi tapahtumien id:t. (Muista yhä, että JS:n puolella aika lasketaan millisekunteina, PHP:ssä kokonaisina sekunteina.)
<?php $ajat = array( 1 => 123456, 2 => 234567 ); ?> var ajat = <?php echo json_encode($ajat); ?>; // var ajat = {"1": "123456", "2": "234567"};
JS:n puolella ajanpäivitysfunktiossa laita käytännössä koko sisältö silmukkaan:
function paivita_ajat() { for (var id in ajat) { var aika = ajat[id]; var span_tunnit = document.getElementById("tunnit_" + id); // Sama vanha koodi toimii taas. } }
Pekka Mansikka ja Jokotai: Kehotan lukemaan kysymykset kunnolla ja vastaamaan niihin järkevästi. Esimerkiksi noilla vastauksilla ei ole mitään tekemistä itse kysymyksen kanssa, ja vastaavaa on teiltä kahdelta ilmennyt monessa muussakin keskustelussa.
Nyt minulla on näin:
<?php $ajat = array( // Ajat ovat kuvitteellisia, mutta tulevaisuudessa 1 => 1295213444, 2 => 1811111111 ); ?> <script type="text/javascript"> var ajat = <?php echo json_encode($ajat); ?>; function paivita_ajat() { for (var id in ajat) { var aika = ajat[id]; var jaljella = Math.max(0, aika - (new Date()).getTime()); var sekunnit = Math.floor(jaljella / 1000); var minuutit = Math.floor(sekunnit / 60); var tunnit = Math.floor(minuutit / 60); minuutit %= 60; sekunnit %= 60; var koko = tunnit + "h " + minuutit + " min " + sekunnit + " s."; document.getElementById("aika_" + id).innerHTML = koko; } setTimeout(paivita_ajat, 1000); } window.onload = paivita_ajat; </script> Asia 1 päättyy <span id="aika_1">?</span><br> Asia 2 päättyy <span id="aika_2">?</span>
Nyt tulostuu jotain, mutta kysymysmerkin tilalle on vain 0h 0min 0s.
Muokkaus. Haa! Kun kerroin jaljella-muuttujassa aika-muuttujan 1000:lla, niin tämä alkoi toimimaan.
Muuten, kun aika on kulunut loppuun, niin miten voin ohjata käyttäjän toiselle sivulle? Tarkistuksen pitäisi jotenkin liittyä taulukkoon. Kun käyttäjä ohjataan uudelle sivulle, niin tietokannasta poistetaan umpeen mennyt aika.
if (jaljella <= 0) { // Vaihdetaan sivua. location.href = "loppui.php?id=" + id; // Lopetetaan taulukon päivitys, ei laiteta ajastusta uudestaan. return; }
lainaus:
Kehotan lukemaan kysymykset kunnolla ja vastaamaan niihin järkevästi.
En näin äkkisestään huomaa, missä olisin käsittänyt väärin?
Eikö niiden tarkoitus ole laskea aika nykyhetkestä määrättyyn hetkeen tulevaisuudessa? Jos ei, niin mitä? Jos jotain muuta, niin ei selviä ainakaan kysymyksestä...minulle. ;)
Pekka Mansikka kirjoitti:
En näin äkkisestään huomaa, missä olisin käsittänyt väärin?
Jo aloitusviestissä todetaan seuraavaa: "Minulla on väkerrelmä, jolla voin toteuttaa yhden laskurin." Tästä ja tätä seuraavasta tarkentavasta selityksestä voi suoraan päätellä, että aloittajan ongelma ei voi olla laskurin toteuttamisessa sinänsä, vaan ongelman on jotenkin liityttävä nimenomaan usean laskurin samanaikaiseen käyttöön. Näinhän kysymys jatkuukin: "Miten saisin järkevämmin tulostettua vaikka kymmenen eri asian laskurit?" Vastaavasti Jokotain viesti oli turha: keskustelun ensimmäisessä lauseessa todetaan, että tieto on jo tietokannassa, joten tähän ei selvästikään tarvita enää apua.
Kyllähän tuolla date_diffillä voi laskea yhtä aikaa vaikka sata laskuria sivulle... samanaikaisesti kuin laskee tiedot....tarkotukseni ei sillä ollut viitata siihen miten saa tehtyä yhden laskurin...mutta arvelen että on helppo oivaltaa että sen voi käydä vain silmukassa läpi yhtä monta kertaa kuin on laskureita. Eri asia jos pitää laskea montako tuntia on tiettyyn hetkeen tulevaisuudessa... eli ei kirjata päiviä lainkaan.
Niin ja laskurin ulkoasusta ei myös ollu ihan tarkkaa sääntöä... pitääkö se näyttää laskurilta vai tekstiltä.
Mutta js:kin on tieten käypä...en sitä morkkaa ollenkaan. ;)
[offtopic]
Muutin pikaisesti date_diffin hour_diffksi, jonka pisin laskuyksikkö on tunti ;)
Jos jollai on tarvis ;)
<?php function hour_diff($sdate, $edate) { $time = $edate - $sdate; if($time>=0 && $time<=59) { // Seconds $timeshift = $time.' seconds '; } elseif($time>=60 && $time<=3599) { // Minutes + Seconds $pmin = ($edate - $sdate) / 60; $premin = explode('.', $pmin); $presec = $pmin-$premin[0]; $sec = $presec*60; $timeshift = $premin[0].' min '.round($sec,0).' sec '; } elseif($time>=3600 && $time<=86399) { // Hours + Minutes $phour = ($edate - $sdate) / 3600; $prehour = explode('.',$phour); $premin = $phour-$prehour[0]; $min = explode('.',$premin*60); $presec = '0.'.$min[1]; $sec = $presec*60; $timeshift = $prehour[0].' hrs '.$min[0].' min '.round($sec,0).' sec '; } elseif($time>=86400) { // Days + Hours + Minutes $pday = ($edate - $sdate) / 86400; $preday = explode('.',$pday); $phour = $pday-$preday[0]; $prehour = explode('.',$phour*24); $premin = ($phour*24)-$prehour[0]; $min = explode('.',$premin*60); $presec = '0.'.$min[1]; $sec = $presec*60; $timeshift = $preday[0]*24+$prehour[0].' hrs '.$min[0].' min '.round($sec,0).' sec '; } return $timeshift; } $alku = time(); // Nämä voi laittaa myös silmukkaan $end = strtotime("2010/05/05 18:00"); echo hour_diff($alku,$end); ?>
Pekka Mansikka: En maininnut kieltä aloitusviestissä, siinä kyllä olet oikeassa ettet voinut ihan tarkalleen tietää mitä haen takaa. Kummiskin, laskurilla yleensä viitataan automaattisesti päivittyvään asiaan, sillä eihän ole järkeä laittaa esimerkiksi PHP:tä päivittämään itseään uudelleen, ja yhä uudelleen. Helpompi on antaa JavaScriptille luku, ja laittaa se laskemaan.
Tosi, kun on kyse "kellosta".... php:lla pitäisi sivu ladata jatkuvasti jotta näyttää ajan oikein edes hetken ;)
Sivulaskuri onki asia erikseen..
Aihe on jo aika vanha, joten et voi enää vastata siihen.