Ajan merkityksestä ja olemuksesta vois kirjotella kaikkea syvällistä, mutta keskitytään tällä kertaa hieman maallisempiin aiheisiin, nimittäin koodaamiseen. Kaikki vähänkin enemmän ohjelmointia harrastaneet tietävät, että päivämäärien ja aikojen käsittely on ohjelmoinnissa ja tietokannoissa melkoinen pain in the ass of Timo.
Galtsussa tämä on ilmennyt muun muassa sillä tavalla, että käyttäjien profiilissa näkyvä ikä on pyöristynyt ylöspäin päivän tai pari ennen syntymäpäivää. Syynä tähän on nuo paholaisen keksinnöt nimeltä karkauspäivät, joita itse kukin on ehtinyt elää syntymävuodesta riippuen erinäisiä määriä.
Kokonaisten vuosien laskeminen iästä on varsin simppeli operaatio, sen kun vähentää nykyisestä vuodesta syntymävuoden ja vielä yhden vuoden lisää, jos tänä vuonna ei vielä ole ollut syntymäpäivää, mutta Galtsussa näytetään ikä desimaalitarkkuudella, joten homma ei olekaan ihan niin simppeli.
Tässä reilun parin vuoden aikana mitä olen ollut töissä, on tuota iän laskemista koitettu korjata useampaankin kertaan, mutta kukaan ei oo koskaan jaksanut panostaa niin paljoa, että se olisi kunnolla saatu korjattua. Tähän asti ikä laskettiin seuraavalla kaavalla:
$age = ((int)(time() - $dob) / 315569.26) / 100;
Eli jaettiin eletyt sekunnit keskimääräisellä vuoden pituudella jaettuna sadalla ja pyöristetty lopputulos jaettiin vielä sadalla. Tuolla jakotempulla saadaan katkaistua desimaaliluku pyöristämättä sitä. Mutta tämä oli tosiaan se bugaava versio. Väkersin tuossa äsken
tuner:in konsultoimana uuden ikäfunktion, joka menee näin:
/**
 * Calculates age from timestamp.
 *
 * @
param int $stamp date of birth as unix timestamp
 * @
param int $precision number of digits after the decimal point
 * @
return float
 */
function stamp_to_age($stamp, $precision = 2) {
    // At first we count how many leap days there has been between the given stamp and current time
    $leap_count = 0;
    $time = time();
    $curr_year = date('Y', $time);
    $curr_month = date('m', $time);
    $stamp_month = date('m', $stamp);
    $year = date('Y', $stamp);
    if ($stamp_month > 2) {
        $year++;
    }
    while ($year < $curr_year) {
        if ($year % 4 == 0 && ($year % 100 != 0 || $year % 400 == 0)) {
            $leap_count++;
        }
        $year++;
    }
    if ($curr_month > 2 && date('L', $time)) {
        $leap_count++;
    }
    // Subtract the leap days from the current time to make the calculated years even and then just cut it to the wanted precision using multiply - round - divide
    return (int)(($time - $stamp - $leap_count * 24 * 60 * 60) / (24 * 60 * 60 * 365) * pow(10, $precision)) / pow(10, $precision);
}
Tässä siis lasketaan ensin kuinka monta karkauspäivää on ehtinyt kulua syntymäpäivän ja nykyisen ajankohdan välillä. Lopussa sitten lasketaan ikä sekunteina, vähennetään siitä karkauspäivät sekunteina ja jaetaan tasavuosilla. Kaiken päälle tehdään vielä tuo sama desimaalien pyöristysleikkaus ja avot, siinä on ikä desimaaleina.
Tosin tämäkään ei ota huomioon sitä, että karkaamatonkaan vuosi ei ole tasan 365 päivää pitkä, vaan sinne tasoitellaan maapallon epätasaisesta pyörimisestä johtuvia karkaussekunteja, mutta ehkäpä tämä tarkkuus riittää Galtsussa iän laskemiseen.. paitsi jos se bugaa ja seuraavana karkauspäivänä joudutaan taas koodaamaan jotain uusiksi. ;P