Avatar billede blackscorpion Nybegynder
03. marts 2005 - 07:56 Der er 39 kommentarer og
1 løsning

Avanceret alders script.

Hej eksperter.

jeg står og skal bruge et bulletproof alders script.

mit gamle er ret buggy, da der er en del dato'er som den messer op. :(

jeg vil gerne have at den viser år, måneder, dage, timer, minutter.

f.eks. jeg er født 05.11.1980 klokken 07:15.

dvs. jeg er: 24 år, 3 måneder, 28dage (tror jeg), 0 timer og 36 minutter.

kunne være meget rart at den selv opdatere. :D
og har altid ment det er en sjov feature.

Nogle bud osv?

skal bruge det så hurtigt som muligt. :D

- BlackScorpion.
Avatar billede sone Nybegynder
03. marts 2005 - 09:19 #1
"skal bruge..."
Som der står på forsiden "Her kan du få svar på dine IT spørgsmål" ;)

Hvad er det så du ikke forstår teknisk?
Avatar billede hmortensen Nybegynder
03. marts 2005 - 12:04 #2
I hvilket format står din tid/dato ?
Avatar billede blackscorpion Nybegynder
03. marts 2005 - 16:11 #3
min side er engelsk hvis det er det du mener?

men skal bare have den til at vise år, måneder, dage, timer og minutter, så sætter jeg selv resten op. :D
Avatar billede blackscorpion Nybegynder
03. marts 2005 - 16:12 #4
mit gamle ser sådan her ud:

stop = mktime(7, 15, 0, 11, 5, 1980); // Syntax: Hour, Min, Sec, Month, Day, Year.
$nu = time();

$years = date("Y", $nu) - date("Y", $stop);
$months = date("m", $nu) - date("m", $stop);
$days = date("d", $nu) - date("d", $stop);

$hours = date("H", $nu) - date("H", $stop);
$mins = date("i", $nu) - date("i", $stop);
$sec = date("s", $nu) - date("s", $stop);

if ( $months < 0 ) {
    $years -= 1;
    $months += 12;
}

if ( $days < 0 ) {
    $years -= 1;
    $days += date("t",$nu);
}

if ( $hours < 0 ) {
    $days -= 1;
    $hours += 24;
}

if ( $mins < 0 ) {
    $hours -= 1;
    $mins += 60;
}

if ($sec < 0 ) {
    $mins -= 1;
    $sec += 60;
}

if($months == "1") {
$mon_txt = $time_text['2'];
}
else {
$mon_txt = $time_text_more['2'];
}

if($days == "1") {
$day_txt = $time_text['3'];
}
else {
$day_txt = $time_text_more['3'];
}

if($hours == "1") {
$hour_txt = $time_text['4'];
}
else {
$hour_txt = $time_text_more['4'];
}

if($mins == "1") {
$min_txt = $time_text['5'];
}
else {
$min_txt = $time_text_more['5'];
}

if($sec == "1") {
$sec_txt = $time_text['6'];
}
else {
$sec_txt = $time_text_more['6'];
}


$age = "$years " . $time_text_more['1'] . ", $months $mon_txt, $days $day_txt, $hours $hour_txt, $mins $min_txt og $sec $sec_txt";
Avatar billede blackscorpion Nybegynder
03. marts 2005 - 16:15 #5
http://www.eksperten.dk/spm/233069 det her er det oprindelige spørgsmål, hvor 'Tipsen' kommer med alskellige eksempler på hvornår det fejler osv. :(
Avatar billede coderdk Praktikant
04. marts 2005 - 07:56 #6
Nu er jeg ikke helt vågen, men hvad med:

    $age = time() - mktime( 10, 20, 0, 7, 7, 1973 );
    // Timestamp starter er fra 1970
    $y = strftime( "%Y", $age ) - 1970;
    // Timestamp starter fra januar, altså 1
    $m = strftime( "%m", $age ) - 1;
    echo strftime( "$y år, $m måneder, %d dage, %H timer og %M minutter gammel", $age );

Bortset fra at det er regnet fra 1/1-1970 så skudår osv ikke er regnet med korrekt, kan nogen så finde andet galt?
Avatar billede coderdk Praktikant
04. marts 2005 - 07:56 #7
Ja, du kan teste med din egen fødselsdag:

    $age = time() - mktime( 7, 15, 0, 11, 5, 1980 );
    $y = strftime( "%Y", $age ) - 1970;
    $m = strftime( "%m", $age ) - 1;
    echo strftime( "$y år, $m måneder, %d dage, %H timer og %M minutter gammel", $age );

heheh
Avatar billede coderdk Praktikant
04. marts 2005 - 07:57 #8
Nu jeg tænker mig om, burde jeg også trække én fra dagen:

    $age = time() - mktime( 7, 15, 0, 11, 5, 1980 );
    $y = strftime( "%Y", $age ) - 1970;
    $m = strftime( "%m", $age ) - 1;
    $d = strftime( "%d", $age ) - 1;
    echo strftime( "$y år, $m måneder, $d dage, %H timer og %M minutter gammel", $age );
Avatar billede coderdk Praktikant
04. marts 2005 - 10:06 #9
Jeg tror jeg tågede da jeg skrev det med skudår, det har jo ikke noget at sige, når vi nu alligevel omregner til år/måneder etc, det er kun hvis du vil have antallet af dage at det kan være et problem ;P Så vidt jeg lige kan se burde den version virke - Virker dog ikke for dato'er før 1/1-1970, så er denne måske lidt bedre på det område ;)

    $str_bday = "5/11/1980 7:15";
    $ar = explode( ' ', $str_bday );
    $dmy = explode( '/', $ar[0] );
    $hm = explode( ':', $ar[1] );
    $ydiff = 2037 - date( 'Y' );
    $age = strtotime( "+$ydiff years" ) - mktime( $hm[0], $hm[1], 0, $dmy[1], $dmy[0], $dmy[2] + $ydiff );
    $y = strftime( "%Y", $age ) - 1970;
    $m = strftime( "%m", $age ) - 1;
    $d = strftime( "%d", $age ) - 1;
    echo strftime( "$y år, $m måneder, $d dage, %H timer og %M minutter gammel", $age );
Avatar billede blackscorpion Nybegynder
04. marts 2005 - 16:18 #10
*LOOOOL* Bare du selv kan finde rundt i det. *GGG*

Jeg tester den lige, så vender jeg vilbage. *G* :D
Avatar billede blackscorpion Nybegynder
04. marts 2005 - 16:20 #11
jeg kan se den skriver følgende:

24 år, 3 måneder, 29 dage, 11 timer og 05 minutter gammel

Kan jeg få lavet 05 om til 5 ??
Avatar billede blackscorpion Nybegynder
04. marts 2005 - 16:26 #12
sidder og glor mig forvirret på : http://dk2.php.net/manual/en/function.strftime.php
og kan ikke lige finde det nogle steder.

Så er vi vel ude i noget med at lave en str_replace på %M for at få fjernet det 0??
Avatar billede blackscorpion Nybegynder
04. marts 2005 - 16:46 #13
fandt ud af at nullet i månederne kan fjernes med %k og %l.

men har ikke kunne finde et alternativ til minutterne. :(
Avatar billede blackscorpion Nybegynder
04. marts 2005 - 17:23 #14
efter lang tid fik jeg problemet løst med:

    $mins = strftime( "%M", $age);
    $mins = str_replace("0", "", $mins);
   
    if(!$mins) {
    $mins = "0";
    }
Avatar billede blackscorpion Nybegynder
04. marts 2005 - 17:47 #15
Sådan her ser det færdige script ud:

<?php
function show_age() {
    setlocale (LC_ALL, 'da_DK');
    $str_bday = "5/11/1980 7:15";
    $ar = explode( ' ', $str_bday );
    $dmy = explode( '/', $ar[0] );
    $hm = explode( ':', $ar[1] );
    $ydiff = 2037 - date( 'Y' );
    $age = strtotime( "+$ydiff years" ) - mktime( $hm[0], $hm[1], 0, $dmy[1], $dmy[0], $dmy[2] + $ydiff );
    $y = strftime( "%Y", $age ) - 1970;
    $m = strftime( "%m", $age ) -1;
    $d = strftime( "%d", $age ) -1;       
    $t = strftime( "%k", $age) -1;
    $m = strftime( "%M", $age);
    $m = str_replace("0", "", $m);
   
    if(!$m) {
    $m = "0";
    }
   
    $måneder = "måned";
    $dage = "dag";
    $timer = "time";
    $minutter = "minut";
   
    if($m != "1") {
    $måneder = $måneder . "er";
    }
   
    if($d != "1") {
    $dage = $dage . "e";
    }
   
    if($t != "1") {
    $timer = $timer . "r";
    }
   
    if($m != "1") {
    $minutter = $minutter . "ter";
    }
   
    $age = strftime( "$y år, $m $måneder, $d $dage, $t $timer og $m $minutter", $age );
   
    return($age);
}

echo show_age();
?>

Tak for hjælpen. :D :D
Avatar billede blackscorpion Nybegynder
04. marts 2005 - 17:49 #16
okey never mind, det er totalt buggy.

smider lige et nyt når det er løst.
Avatar billede blackscorpion Nybegynder
04. marts 2005 - 17:58 #17
hmm den kegler rundt i timerne...

f.eks. hvis jeg vælger en dato hvor månederne enten er 0 eller 1, så passer timerne.
men alle andre tidspunkter, så lægger den en time til?
Avatar billede blackscorpion Nybegynder
04. marts 2005 - 18:01 #18
f.eks.

nu er klokken 18.00

og jeg skulle i følge den være

24 år, 3 måneder, 29 dage, 11 timer og 45 minutter gammel.

men det passer jo ikke helt når jeg er født 07:15 ... så der er en time for meget på.
Avatar billede detox Nybegynder
04. marts 2005 - 18:02 #19
Måske det er noget med sommertid?
Avatar billede blackscorpion Nybegynder
04. marts 2005 - 18:11 #20
sommertid!? ...

jamen hvis det er rigtigt, så burde den jo passe hele vejen rundt, når serveren automatisk skifter over til sommertid?
Avatar billede blackscorpion Nybegynder
04. marts 2005 - 18:27 #21
gal den er buggy...

hvis jeg sætter tiden til 5/1/1980, så påstår den jeg er 25 år, 2 måneder og 0 dage.

burde jo kun være 25 år, 1 måned og omkring 27 dage eller noget i den stil...
Avatar billede coderdk Praktikant
04. marts 2005 - 20:59 #22
Hmm ja, jeg har lavet lidt om i den:

    $str_bday = "5/1/1980 7:15";
    $ar = explode( ' ', $str_bday );
    $dmy = explode( '/', $ar[0] );
    $hm = explode( ':', $ar[1] );
    $ydiff = 2037 - date( 'Y' );
    $age = strtotime( "+$ydiff years" ) - mktime( $hm[0], $hm[1], 0, $dmy[1], $dmy[0], $dmy[2] + $ydiff );
    $y = strftime( "%Y", $age ) - 1970;
    $m = strftime( "%m", $age ) - 1;
    $d = strftime( "%d", $age ) - 1;
    $ho = strftime( "%H", $age ) + 0;
    $mi = strftime( "%M", $age ) + 0;
    echo "$y år, $m måned" . ( $m != 1 ? 'er' : ''  );
    echo ", $d dag" . ( $d != 1 ? 'e' : '' );
    echo ", $ho time" . ( $ho != 1 ? 'r' : '');
    echo " og $mi minut" . ( $mi != 1 ? 'ter' : '' ) . " gammel";

Men den der giver stadig 25 år, 2 måneder, 0 dage, 14 timer og 42 minutter gammel - hvorfor er jeg ikke lige klar over ;P Muligvis noget med skudår i udregningen, jeg er ikke sikker ;P
Avatar billede blackscorpion Nybegynder
04. marts 2005 - 21:01 #23
har smidt en post på DevNetwork Forums, og der enighed om at det er "daylight savings!"

sagde at det var jeg klar over, spurgte efter et bud på hvordan det løses.

"Posted: Friday 4th March 2005 20:22:46    Post subject:   

--------------------------------------------------------------------------------

pass false/0 for the last argument to mktime() ?

there's a time to seconds function in Code Snippets if you want to see another example.. sorta."
Avatar billede blackscorpion Nybegynder
04. marts 2005 - 21:02 #24
sagde at jeg havde prøvet det, endda også med gmmktime.

intet virkede, og nu har jeg så intet hørt. :(
Avatar billede coderdk Praktikant
04. marts 2005 - 21:25 #25
Jeg tror nu ikke det er daylight savings, det er jo kun en time - Vi er i hvert tilfælde en dag off i dette tilfælde, det tyder på at det er noget skudår...
Jeg er ikke 100% sikker på den, men prøv denne:

<?php

    $str_bday = "5/1/1980 7:15";
    $ar = explode( ' ', $str_bday );
    $dmy = explode( '/', $ar[0] );
    $hm = explode( ':', $ar[1] );
    $ydiff = 2037 - date( 'Y' );
    $enddate = strtotime( "+$ydiff years" );
    $thedate = mktime( $hm[0], $hm[1], 0, $dmy[1], $dmy[0], $dmy[2] + $ydiff );
    if ( date( "L", $thedate ) == 1 )
    {
        $thedate += ( 60 * 60 * 24 );
    }
    $age =  $enddate - $thedate;
    $y = strftime( "%Y", $age ) - 1970;
    $m = strftime( "%m", $age ) - 1;
    $d = strftime( "%d", $age ) - 1;
    $ho = strftime( "%H", $age ) + 0;
    $mi = strftime( "%M", $age ) + 0;
    echo "$y år, $m måned" . ( $m != 1 ? 'er' : ''  );
    echo ", $d dag" . ( $d != 1 ? 'e' : '' );
    echo ", $ho time" . ( $ho != 1 ? 'r' : '');
    echo " og $mi minut" . ( $mi != 1 ? 'ter' : '' ) . " gammel";

?>

Den returnerer 25 år, 1 måned, 27 dage, 15 timer og 10 minutter gammel
Avatar billede detox Nybegynder
04. marts 2005 - 22:14 #26
Men hvis jeg tester med: $str_bday = "31/1/2005 23:59";
giver det: 0 år, 1 måned, 0 dage, 22 timer og 14 minutter gammel
og det er helt ved siden af ;O)
Avatar billede detox Nybegynder
04. marts 2005 - 22:15 #27
eller rettere 4 dage for lidt...
Avatar billede detox Nybegynder
04. marts 2005 - 22:18 #28
PS: og det var endda først efter jeg rettede til:

$ho = strftime( "%H", $age ) - 1;

hvilken jeg nu ikke kan se fornuften i?
Avatar billede coderdk Praktikant
05. marts 2005 - 00:58 #29
Sådan noget her pisser mig af, så jeg måtte lige finde en løsning, så vidt jeg lige kan se kan det ikke lade sig gøre sådan alligevel, så jeg har lavet en løsning som jeg tror holder:

    function calcAge( $str_bday )
    {
        $ar = explode( ' ', $str_bday );
        $dmy = explode( '/', $ar[0] );
        $hm = explode( ':', $ar[1] );
   
        $yd = date( 'Y' ) - $dmy[2];
        $md = date( 'm' ) - $dmy[1];
        $dd = date( 'd' ) - $dmy[0];
        $hod = date( 'H' ) - $hm[0];
        $mid = date( 'i' ) - $hm[1];
       
        if ( $mid < 0 )
        {
            // Negative minutes, adjust it and decrement hours
            $mid = 60 + $mid;
            $hod -= 1;
        }
        if ( $hod < 0 )
        {
            // Negative hours, adjust it and decrement days
            $hod = 24 + $hod;
            $dd -= 1;
        }
        if ( $dd < 0 )
        {
            // Negative days, what to do...
            if ( date( 'd', mktime( 0, 0, 0, date( 'm' ), -1, date( 'Y' ) ) ) < $dmy[0] )
            {
                // The old date's day is past this month, so just set days to
                // the amount of days past in this month
                $dd = date( 'd' ) + 0;
            }
            else
            {
                // Calculate the day numbers of one month past with the old
                // date's day, and the day number of today to get the days
                $before = mktime( 0, 0, 0, date( 'm' ) - 1, $dmy[0], date( 'Y' ) );
                $beforenum = date( 'z', $before ) + ( date( 'L', $before ) && date( 'm', $before ) > 2 ? 1 : 0 );
                $todaynum = date( 'z' ) + ( date( 'L' ) && date( 'm' ) > 2 ? 1 : 0 );
                $dd = $todaynum - $beforenum;
            }
            // Decrement months
            $md -= 1;
        }
        if ( $md < 0 )
        {
            // Negative months, adjust it and decrement years
            $md = 12 + $md;
            $yd -= 1;
        }
        // Return it
        $res = array(
                'year' => $yd
                ,'month' => $md
                ,'day' => $dd
                ,'hour' => $hod
                ,'min' => $mid
            );
        return $res;
    }

    $str_bday = "27/1/2005 23:59";
    $age = calcAge( $str_bday );
    echo "$age[year] y $age[month] m $age[day] d $age[hour]:$age[min]";
Avatar billede blackscorpion Nybegynder
05. marts 2005 - 02:52 #30
Coderdk... så vidt jeg kan teste mig frem til, så virker det uanset hvad pokker jeg så end gør ved den... selv når jeg tror jeg har fundet en dato hvor den viser en time for meget eller noget, finder jeg ud af det er mig der har dummet mig med tiden...

Damn... hvordan kom du "bare" på den løsning???

skal jeg oprette et spørgsmål så du kan få point?
Avatar billede blackscorpion Nybegynder
05. marts 2005 - 02:55 #31
Coderdk.. må have lov at sige, den næste uge er du uforbeholdt min eneste Gud. :D
Avatar billede coderdk Praktikant
05. marts 2005 - 02:58 #32
hehehe ja, det eneste jeg lige kan komme på der skulle få den til at være forkert, er sommer-/vintertid, eller det tror jeg da ;-)

Jeg blev bare irriteret, sådan noget burde være meget nemt... Så jeg satte mig bare ned og tænke over hvad der skulle til for at regne sådan noget ud, og dette var resultatet ;P

Nej, jeg skal ikke have flere point, ellers tak - Du har allerede accepteret mit svar for 200 point!

Håber du kan bruge det, så :)
Avatar billede coderdk Praktikant
05. marts 2005 - 02:59 #33
lol :)
Avatar billede blackscorpion Nybegynder
05. marts 2005 - 03:01 #34
om jeg kan bruge det?? jeg brænder det ud på 117 skiver for at være sikker på ikke at miste det. *GGG*

Sad med samme problem for omkring 2½ år siden... og havde stadig samme problem som med dette.

Den regnede totalt forkert, men det link har jeg også postet.

ang. point'ne, læste ikke lige toppen, så troede det var detox der havde svaret. :D

men har du msn eller en email man må få eller noget?? :D
Avatar billede coderdk Praktikant
05. marts 2005 - 03:09 #35
Jeg giver kun min MSN ud til en lille lukket kreds, men du kan da få min mail, den er lars snabel-a coder punktum dk ;)
Avatar billede blackscorpion Nybegynder
05. marts 2005 - 03:12 #36
okey takker. :D

sender nok en email hvis jeg får problemer, lidt nemmere, hvis det ikke gør noget?
Avatar billede coderdk Praktikant
05. marts 2005 - 03:19 #37
Det er fint ;)
Avatar billede blackscorpion Nybegynder
05. marts 2005 - 03:20 #38
okey takker. :)

lige et sidste spørgsmål, sidder og læser om auth, og kan se mange steder, ikke kun i denne artikel, bruger de @ foran variablerne.

f.eks:

[php:1:ee418c2783]<?php
session_set_cookie_params(0, '/', '.foo.com');
@session_start();
?>[/php:1:ee418c2783]

hvad gør @ foran session_start(); ?
Avatar billede coderdk Praktikant
05. marts 2005 - 03:23 #39
@ undertrykker fejlbeskeder, du kan se det sådan:

    if ( $fp = fopen( 'heste', 'r' ) )
    {
        fclose( $fp );
        echo "Åbnede filen...";
    }
    else
    {
        echo "Kunne ikke åbne filen...";
    }

Her vil komme en fejl fra fopen, og her vil ikke:

    if ( $fp = @fopen( 'heste', 'r' ) )
    {
        fclose( $fp );
        echo "Åbnede filen...";
    }
    else
    {
        echo "Kunne ikke åbne filen...";
    }
Avatar billede blackscorpion Nybegynder
05. marts 2005 - 03:26 #40
ahhh smart... så den undertrykker bare fejlkoder. :D

tak for svaret. :D

bare noget jeg har spekuleret på en del tid, men aldrig rigtigt fået noget svar osv. *G*

nå jeg daffer i seng, endnu engang tak for hjælpen, og godnat og sov godt. :D
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