Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: php & tunnit

Sivun loppuun

ViKiNGi [03.05.2012 13:12:27]

#

Moikka,

pienessä asiassa tarvitsisin tietoa (kellonaikojen laskeminen).

Hiuksia jo hetken harmaannuttanut ongelman kanssa..


tunti:minuutti muotoisten kellonaikojen yhteenlaskeminen php:llä.

esim. 04:35 + 10:25 = xx:xx
tai

16:20 - 11:23 = xx:xx

vastaukset pitäisi saada tuossa tunnit:minuutit muodossa.


Miten yleensä tekisitte tuntikirjanpitoa, jossa ajat yleensä pyörivät maksimissaan 24tunnissa. Pidättekö tuntimäärän tietokannassa TIME -muodossa (hh:mm) vai minuutteina INT:nä vai sekunteina tai sekunteina UNIX-muodossa? Mistä olisi parasta laskeskella tuntimääriä?

..nimim. vaikeus päättää lopullinen muoto..

pistemies [03.05.2012 13:49:37]

#

Minä olen tehnyt tähän tapaan:

<?php
function des($min){
        $h = explode(":",$min);
        $minute = $h[0]*60+$h[1];
        $hours = $minute/0.6;
        return(round($hours/100,2));
    }


  $aika = des("04:35") +  des("10:25");

 echo $aika;

 ?>

Tuosta kai osaat itsekin jatkaa, miten esim. 0.25 tuntia muutetaan tarvittaessa varttitunniksi ja saat siihen muut muotoilut.

ViKiNGi [03.05.2012 13:54:19]

#

Pohdein aivan samaa, mutta sitten desimaalit sotkevat vähän aikaa -> pyöristää minuutteja enemmän tai vähemmän.

Toiseksi esim: 08:00 + 08:00 = 16:00, nyt tulee = 04:00.. ei tulostu oikein nuo yli 12h merkinnät..

Lebe80 [03.05.2012 13:58:14]

#

Pistemies: mistä noin perverssi laskutapa?

Eli muutat aluksi tunnit minuuteiksi, jotka muutat heti seuraavaksi takaisin tunneiksi.

pistemies [03.05.2012 14:06:41]

#

ViKiNGi kirjoitti:

Pohdein aivan samaa, mutta sitten desimaalit sotkevat vähän aikaa -> pyöristää minuutteja enemmän tai vähemmän.

Toiseksi esim: 08:00 + 08:00 = 16:00, nyt tulee = 04:00.. ei tulostu oikein nuo yli 12h merkinnät..

Kyllä tuo minulla tulostaa 16.
Tässä vaihtoehto palautukseen:

<?php
function des($min){
        $h = explode(":",$min);
        $minute = $h[0]*60+$h[1];
        $hours = $minute/0.6;
        return(round($hours/100,2));
    }
 function minutes($num){

      if(strpos($num,'.')){
        $h = explode('.',$num);
        $hours = $h[0];
        $min = $h[1]*0.6;

          return($hours.':'.$min);
      }
      else{
        return($num.':00');
        }

    }

 $aika = des("16:20") -  des("11:23");
 echo minutes($aika);
?>

Nämä on minun yli viiden vuoden takaisia juttuja. Varmaan php-manuaalista löytyy näillekin valmis ratkaisu, esim. funktio date_diff.

jalski [03.05.2012 14:19:00]

#

Mitä jos vain muutat koko roskan ensin sekunneiksi, lasket ja muunnat sitten takaisin oikeaan muotoon?

sekunnit = tunnit*3600 + minuutit*60

tunnit = (sekunnit/3600) % 24
minuutit = (sekunnit/60) % 60

Lebe80 [03.05.2012 14:23:20]

#

Itekin käyttäisin todennäköisesti arvoissa sekunteja ja vasta tulostusvaiheessa muuntaisin haluttuun muotoon, jottei "dataa hukkuisi".

Metabolix [03.05.2012 14:30:04]

#

Tietokantaan TIME on hyvä tyyppi, mutta toki sekunnitkin käyvät. PHP:ssä laskut on helpointa tehdä sekunteina. Liukulukuja kannattaa välttää pyöristysvirheiden takia.

Tässä on pistemiehelle vähän opeteltavaa: vastaavat funktiot höystettynä sekunneilla ja negatiivisilla luvuilla.

class SQLTime {
	public static function toSeconds($str) {
		if ($str[0] == "-") {
			return -self::toSeconds(substr($str, 1));
		}
		sscanf($str, "%d:%d:%d", $h, $min, $s);
		return $h * 3600 + 60 * $min + $s;
	}
	public static function fromSeconds($s) {
		if ($s < 0) {
			return "-". self::fromSeconds(-$s);
		}
		return sprintf("%02d:%02d:%02d", $s / 3600, ($s / 60) % 60, $s % 60);
	}
}
echo SQLTime::toSeconds("04:35:00"), "\n"; // 16500
echo SQLTime::fromSeconds(-86104), "\n";  // -23:55:04

ViKiNGi [03.05.2012 15:13:44]

#

Tässä hetken tutkittuani tuota juttua, taidampa alkaa tekemään noita tuntien tallentamisia sekuntteina. Eipähän tarvitse ähkiä suottapäiten tuon 1970-01-01 kanssa ja muiden muunnoksien.

TIME_TO_SEC ja SEC_TO_TIME taitaa käydä tähän mun tarkoitukseen parhaiten..

Kiitos vastanneille!

Tukki [03.05.2012 15:27:50]

#

Kysymys ei ehkä ole ihan niin simppeli kuin miltä kuulostaa. Tässä on kaksi eri asiaa mitkä helposti mielletään samaksi koska niitä usein merkitään samalla tavalla: kellonaika ja ajanjakson pituus. Kellonaikoja ja jaksoja on ihan mielekästä laskea yhteen ja jaksoja keskenään, mutta kellonaikojen laskeminen yhteen ei tunnu kovin järkevältä. "varttia vaille kuus (05:45) plus kolme ja puol tuntia (03:30)" on selkeästi "vartin yli yhdeksän (09:15)" mutta "varttia vaille kuus (05:45) plus puol neljä (03:30)" ei olekaan enää kovin järkevää. Eli kannattaa olla tarkkana kumpaa milloinkin tarkoitetaan.

Tuntikirjanpidossa on yleensä kyse siitä että halutaan kirjata jotain todellisia tapahtuneita asioita joilla on jokin alkuheti ja loppuhetki. Itse kirjaisin kantaan nämä todelliset alkuhetket ja loppuhetket timestamp-muodossa jolloin mukana olisi sekä päivämäärä että kellonaika. Muut tarvittavat tiedot, kuten tapahtumien keston, saa laskettua näiden avulla.

Koodissa muuttaisin kannasta tulevat timestampit aina php:n DateTime-olioiksi tai joksikin tuosta luokasta perityn luokan olioiksi (onnistuu suoraan valmiilla konstruktorilla) ja käsittelisin niitä sen kautta. Koittaisin pitää arvot mahdollisimman pitkään olioina ja muuttaa ihmisen ymmärrettävään muotoon vasta ruudulle tulostettaessa. Näin ainakin välttyy siltä että pitää joka välissä pohtia että missän muodossa tämä minun aikaa kuvaava muuttujani nyt olikaan ja mitä sille pitää tehdä että sen voi laskea yhteen tuon toisen kanssa.

Tuntikirjanpidon tekemisessä käteviä ja tutustumisen arvoisia DateTime-luokan funktioita ovat varmaan ainakin modify(), format(), sub() ja diff() joka palauttaa ajanjaksoa kuvaavan DateDiff-olion. DateDiff-api on hieman suppea, mutta perinnällä sillekin saa tehtyä omia laajennoksia. Lisäksi kannattaa huomata että DateTime-olioita voi PHP:ssä vertailla suoraan <,> ja == operaattoreilla.

ViKiNGi [16.05.2012 09:27:35]

#

Kiitos !


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta