Avatar billede Hans1 Praktikant
05. marts 2012 - 11:09 Der er 16 kommentarer og
1 løsning

Hjælp til angivelse af tid

Jeg er ved at lave en funktion hvor jeg gerne vil udskrive tiden i minutter, timer, dage, år alt efter hvor mange minutter der er tale om.

Jeg bruger denne kode hvor jeg i $stmt->num_rows har antal rækker som bliver retuneret hver række gælder for 5 min. Derfor ganger jeg med 5 i $time variablen. 


$time = $stmt->num_rows * 5;


Så jeg mangler en funktion som fx ændre til time/timer når vi er på over 60 min o.s.v
Avatar billede olsensweb.dk Ekspert
05. marts 2012 - 12:16 #1
prøv dette
function Time2Array($min){     
    $ar = array();
    $ar['days'] = (int) ($min/1440) ;
    $ar['hours'] =  (int) (($min/60) % 24) ;
    $ar['minutes'] = (int) (($min) % 60) ;       
    return $ar;       
}

$tid_ar=Time2Array(1440); // 1 dag 0 timer 0 min
echo "det er ".$tid_ar['days']." dage ".$tid_ar['hours']." timer ".$tid_ar['minutes']." minutter ";
Avatar billede Hans1 Praktikant
05. marts 2012 - 14:26 #2
Tak. Jeg vil prøve at teste det.
Avatar billede olsensweb.dk Ekspert
05. marts 2012 - 15:06 #3
nb: jeg ville nok bruge sekunder som referance da meget tids beregning i PHP er i sekunder 

function Time2Array($sec){   
    $ar = array();
    $ar['years'] = (int) ($sec/31536000); // *** tager ikke højde for skudår. antager der er 365 dage på et år
    // er en måned 28,29,30, eller 31 dage ?? derfor regner jeg ikke måned ud
    $ar['days'] = (int) ($sec/86400) %365;
    $ar['hours'] =  (int) (($sec/3600) % 24) ;
    $ar['minutes'] = (int) (($sec /60) % 60) ;
    $ar['seconds'] = (int) ($sec % 60) ;
    return $ar;       
}

$tid_ar=Time2Array(31536060); // det er 1 år 0 dage 0 timer 1 minutter 0 sekunder
echo "det er ".$tid_ar['years']." år ".$tid_ar['days']." dage ".$tid_ar['hours']." timer ".$tid_ar['minutes']." minutter ".$tid_ar['seconds']." sekunder ";
   

hvordan vil du tage højde for skudår ??, når du angiver hvor lang tid siden det er, så skal dette år vil medregnes i angivelsen
Avatar billede Hans1 Praktikant
05. marts 2012 - 16:35 #4
Jeg har ikke lige tænkt på skudår.

Burde denne kode kunne omskrives til det jeg gerne vil frem for dets nuværende funktion hvor der angives et tidspunkt?


<?php
echo "Cirka ".nicetime($msg_time); // $msg_time er i format 2010-11-30 16:46:33

function nicetime($date)
{
    if(empty($date)) {
        return "Ingen dato modtaget";
    }
   
    $periods        = array("sekund", "minut", "time", "dag", "uge", "måned", "år", "årti");
    $lengths        = array("60","60","24","7","4.35","12","10");
   
    $now            = time();
    $unix_date        = strtotime($date);
   
      // check om datoen er valid
    if(empty($unix_date)) { 
        return "Forket type dato";
    }

    // Er det en fremtidig eller fortidig dato
    if($now > $unix_date) { 
        $difference    = $now - $unix_date;
        $tense        = "siden";
       
    } else {
        $difference    = $unix_date - $now;
        $tense        = "fra nu af";
    }
   
    for($j = 0; $difference >= $lengths[$j] && $j < count($lengths)-1; $j++) {
        $difference /= $lengths[$j];
    }
   
    $difference = round($difference);
   
    if($difference != 1) {
            if ($periods[$j] == 'sekund') $periods[$j].= "er";
            if ($periods[$j] == 'minut') $periods[$j].= "ter";
            if ($periods[$j] == 'time') $periods[$j].= "r";
            if ($periods[$j] == 'dag') $periods[$j].= "e";
            if ($periods[$j] == 'uge') $periods[$j].= "r";
            if ($periods[$j] == 'måned') $periods[$j].= "er";
            if ($periods[$j] == 'år') $periods[$j].= "";
            if ($periods[$j] == 'årti') $periods[$j].= "er";
    }
   
    return "$difference $periods[$j] {$tense}";
}

?>
Avatar billede Slettet bruger
05. marts 2012 - 17:32 #5
Jeg har fornylig skulle bruge noget lignende samme feature, bare i JavaScript, hvor jeg lavede en funktion der tog udgangspunkt fra følgende kode http://www.if-not-true-then-false.com/2010/php-calculate-real-differences-between-two-dates-or-timestamps/

Kan være du kan bruge det til noget!
Avatar billede Hans1 Praktikant
05. marts 2012 - 18:12 #6
Fedt ser hvad jeg kan finde ud af.
Avatar billede olsensweb.dk Ekspert
05. marts 2012 - 18:23 #7
kig også på date-diff

Toine (contact at toine dot pro) 26-Aug-2011 07:22
This is a very simple function to calculate the difference between two timestamp values.
<?php
function diff($start,$end = false) {
    /*
    * For this function, i have used the native functions of PHP. It calculates the difference between two timestamp.
    *
    * Author: Toine
    *
    * I provide more details and more function on my website
    */

    // Checks $start and $end format (timestamp only for more simplicity and portability)
    if(!$end) { $end = time(); }
    if(!is_numeric($start) || !is_numeric($end)) { return false; }
    // Convert $start and $end into EN format (ISO 8601)
    $start  = date('Y-m-d H:i:s',$start);
    $end    = date('Y-m-d H:i:s',$end);
    $d_start    = new DateTime($start);
    $d_end      = new DateTime($end);
    $diff = $d_start->diff($d_end);
    // return all data
    $this->year    = $diff->format('%y');
    $this->month    = $diff->format('%m');
    $this->day      = $diff->format('%d');
    $this->hour    = $diff->format('%h');
    $this->min      = $diff->format('%i');
    $this->sec      = $diff->format('%s');
    return true;
}

/*
* How use it?
*
* Call your php class (myClass for this example) and use the function :
*/
$start  = strtotime('1985/02/09 13:54:17');
$end    = strtotime('2012/12/12 17:30:21');
$myClass = new myClass();
$myClass->Diff($start,$end);
// Display result
echo 'Year: '.$myClass->Year;
echo '<br />Month: '.$myClass->Month;
echo '<br />Day: '.$myClass->Day;
echo '<br />Hour: '.$myClass->Hour;
echo '<br />Min: '.$myClass->Min;
echo '<br />Sec: '.$myClass->Sec;
// Display only month for all duration
$month = ($myClass->Year * 12) + $myClass->Month;
echo '<br />Total month: '.$month;
// if you want you can use this function without $end value :
$myClass->Diff($start);
// Automatically the end is the current timestamp
?>
Avatar billede Slettet bruger
05. marts 2012 - 19:16 #8
@ronols Hmm den havde jeg ikke lige set! Den ser jo ret perfekt ud til det her.
Avatar billede olsensweb.dk Ekspert
05. marts 2012 - 20:22 #9
skulle selv lige prøve den, og blev glædelig overrasket, den tager forbehold for skudår, det er en klar kandidat til mit functions lib
<?php
class myClass{
public $year;
public $month;
public $day;
public $hour;
public $min;
public $sec;
       
    public function diff($start,$end = false) {
        /*
        * For this function, i have used the native functions of PHP. It calculates the difference between two timestamp.
        *
        * Author: Toine
        *
        * I provide more details and more function on my website
        */

        // Checks $start and $end format (timestamp only for more simplicity and portability)
        if(!$end) { $end = time(); }
        if(!is_numeric($start) || !is_numeric($end)) { return false; }
        // Convert $start and $end into EN format (ISO 8601)
        $start  = date('Y-m-d H:i:s',$start);
        $end    = date('Y-m-d H:i:s',$end);
        $d_start    = new DateTime($start);
        $d_end      = new DateTime($end);
        $diff = $d_start->diff($d_end);
        // return all data
        $this->year    = $diff->format('%y');
        $this->month    = $diff->format('%m');
        $this->day      = $diff->format('%d');
        $this->hour    = $diff->format('%h');
        $this->min      = $diff->format('%i');
        $this->sec      = $diff->format('%s');
        return true;
    }
}

$myClass = new myClass();
$start = time() - 31536060; // 1 år og 1 min, hvis det ikke var skudår :)
$myClass->Diff($start);

// Display result
echo '<br />Year: '.$myClass->year;
echo '<br />Month: '.$myClass->month;
echo '<br />Day: '.$myClass->day;
echo '<br />Hour: '.$myClass->hour;
echo '<br />Min: '.$myClass->min;
echo '<br />Sec: '.$myClass->sec;
/* det er jo skud år i år
Year: 0
Month: 11
Day: 28
Hour: 0
Min: 1
Sec: 0
*/
?>



så din udregning burde være noget med
// tiden nu - 5 min pr række * 60 sek
$time = (time() - ($stmt->num_rows * 5*60));
$myClass->Diff($time);
// Display result
echo '<br />Year: '.$myClass->year;
echo '<br />Month: '.$myClass->month;
echo '<br />Day: '.$myClass->day;
echo '<br />Hour: '.$myClass->hour;
echo '<br />Min: '.$myClass->min;
echo '<br />Sec: '.$myClass->sec;
Avatar billede Hans1 Praktikant
06. marts 2012 - 11:50 #10
Det ser ud til at virke rigtig godt.

Nu mangler jeg bare at den kun skal udskrive hvis der står noget i variablen:

fx skal den kunne skrive i både ental og i flertal.
Og den skal ikke udskrive 0 dage/ 0 dag hvis der jo er de antal minutter.

1 time og 20 minutter.
2 timer og 1 minut.
Avatar billede olsensweb.dk Ekspert
06. marts 2012 - 12:47 #11
her er den omskrevet som fri function
<?php
// denne function har lav binding og kan bruges meget generalt, og bør ligge i et code lib
function Diff($start,$end = false) {
    // Checks $start and $end format (timestamp only for more simplicity and portability)
    if(!$end) { $end = time(); }
    if(!is_numeric($start) || !is_numeric($end)) { return false; }
    // Convert $start and $end into EN format (ISO 8601)
    $start  = date('Y-m-d H:i:s',$start);
    $end    = date('Y-m-d H:i:s',$end);
    $d_start    = new DateTime($start);
    $d_end      = new DateTime($end);
    $diff = $d_start->diff($d_end);
       
    // http://dk.php.net/manual/en/dateinterval.format.php
    // retunerer uden foranstillet nuller, kan laves om via formattet
    $ar = array();
    $ar['years'] = $diff->format('%y');
    $ar['months'] = $diff->format('%m');       
    $ar['days'] = $diff->format('%d');
    $ar['hours'] =  $diff->format('%h');
    $ar['minutes'] = $diff->format('%i');
    $ar['seconds'] = $diff->format('%s');
    return $ar;               
}

// denne function har høj binding, og er meget specialiceret til netop dette program
function Print_Formateret($ar){   
    $txt="";
    // http://dk.php.net/manual/en/control-structures.foreach.php   
    foreach ($ar as $key => $value ) {
        if($value>0) $txt.=" ".$value." ".$key;       
    }
    unset($value); // break the reference with the last element
    return $txt;
}

$start  = strtotime('1985/02/09 13:54:17');
$end    = strtotime('2012/12/12 17:30:21');
$ar = Diff($start,$end);
$txt = Print_Formateret($ar);
echo "<br />".$txt;

$start = time() - 31536060; // 1 år og 1 min, hvis det ikke var skudår :)
$ar = Diff($start);
$txt = Print_Formateret($ar);
echo "<br />".$txt;
?>


output:
27 years 10 months 3 days 3 hours 36 minutes 4 seconds
11 months 28 days 1 minutes

>Nu mangler jeg bare at den kun skal udskrive hvis der står noget i variablen:
det er lavet i Print_Formateret($ar), så mangler der bare det bliver danske tekster istedet for key navnet :)
Avatar billede olsensweb.dk Ekspert
06. marts 2012 - 13:05 #12
>så mangler der bare det bliver danske tekster istedet for key navnet :)
så er det også klaret

function Print_Formateret($ar){    
    $txt="";
    // http://dk.php.net/manual/en/control-structures.foreach.php
    foreach ($ar as $key => $value ) {
        if($value>0){
            switch($key){
                case "years" : $k=($value==1)? "år" :"år" ; break;
                case "months" : $k=($value==1)? "Måned" :"Månder" ; break;
                case "days" : $k=($value==1)? "dag" :"dage" ; break;
                case "hours" : $k=($value==1)? "time" :"timer" ; break;
                case "minutes" : $k=($value==1)? "minut" :"minutter" ; break;
                case "seconds" : $k=($value==1)? "sekundt" :"sekundter" ; break;                   
            }
            $txt.=" ".$value." ".$k;       
        }   
    }
    unset($value); // break the reference with the last element
    return $txt;
}

output:
27 år 10 Månder 3 dage 3 timer 36 minutter 4 sekundter
11 Månder 28 dage 1 minut
Avatar billede Hans1 Praktikant
06. marts 2012 - 13:46 #13
@ronols Det bare i orden det der. Smid et svar.
Avatar billede olsensweb.dk Ekspert
06. marts 2012 - 13:57 #14
får du her
Avatar billede Hans1 Praktikant
06. marts 2012 - 14:35 #15
Hmm jeg ville godt lave det med "og" i mellem hver:
11 Måneder og 28 dage og 1 minut.

Men hvis jeg prøver starter den også med "og" ved første angivelse.

og 11 Måneder og 28 dage og 1 minut.
Avatar billede olsensweb.dk Ekspert
06. marts 2012 - 14:51 #16
function Print_Formateret($ar){    
    $txt="";
    // http://dk.php.net/manual/en/control-structures.foreach.php
    foreach ($ar as $key => $value ) {
        if($value>0){
            switch($key){
                case "years" : $k=($value==1)? "år" :"år" ; break;
                case "months" : $k=($value==1)? "Måned" :"Måneder" ; break;
                case "days" : $k=($value==1)? "dag" :"dage" ; break;
                case "hours" : $k=($value==1)? "time" :"timer" ; break;
                case "minutes" : $k=($value==1)? "minut" :"minutter" ; break;
                case "seconds" : $k=($value==1)? "sekundt" :"sekundter" ; break;                   
            }
            // $txt.=" ".$value." ".$k;       
            $txt.=" ".$value." ".$k." og";       
        }           
    }
    $txt = substr($txt,0,-3);

    unset($value); // break the reference with the last element
    return $txt;
}

output:
27 år og 10 Måneder og 3 dage og 3 timer og 36 minutter og 4 sekundter
11 Måneder og 28 dage og 1 minut
Avatar billede Hans1 Praktikant
06. marts 2012 - 15:03 #17
Tak.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester