113 dager er 3 måneder og 3 uker

Å jobbe med datoer, det være seg i mattestykker eller programmering, har jeg tidvis funnet vrient. Det er lett å finne ut hvor mange dager det er siden sommerferien var over, eller hvor mange dager det er til jul, men vi mennesker teller ikke tid i ti-tall men i måneder, uker, dager og timer. I denne posten viser jeg hvordan du kan telle ned dagene til jul, på en pen menneskevennlig måte, i PHP.
Koden i denne posten er hentet fra Aidan Lister. Det eneste jeg har gjort er å oversette months til måneder, osv.


 * @version     2.0.0
 * @link        http://aidanlister.com/2004/04/making-time-periods-readable/
 * @param       int     number of seconds elapsed
 * @param       string  which time periods to display
 * @param       bool    whether to show zero time periods
 */
function time_duration($seconds, $use = null, $zeros = false)
{
    // Define time periods
// jeg har skrevet å som å - med riktig bruk av charset er dette muligens unødvendig.
    $periods = array (
        'år'      => 31556926,
        'måneder' => 2629743,
        'uker'          => 604800,
        'dager'         => 86400,
        'timer'         => 3600,
        'minutter'      => 60,
        'sekunder'      => 1
        );
    // Break into periods
    $seconds = (float) $seconds;
    foreach ($periods as $period => $value) {
        if ($use && strpos($use, $period[0]) === false) {
            continue;
        }
        $count = floor($seconds / $value);
        if ($count == 0 && !$zeros) {
            continue;
        }
        $segments[strtolower($period)] = $count;
        $seconds = $seconds % $value;
    }
// Build the string
// dette er endret til å fungere med norske suffix
    foreach ($segments as $key => $value) {
        $segment_name = substr($key, 0, -2);
//        $segment_name = substr($key, 0, -1);
        $segment = $value . ' ' . $segment_name;
        if ($value != 1) {
//            $segment .= 's';
            $segment .= 'er';
        }
        $array[] = $segment;
    }
    $str = implode(', ', $array);
    return $str;
}
?>

Denne funksjonen kan du lime rett inn i php-dokumentet ditt, kanskje helst inn i en klasse av noe slag?

Så når funksjonen kjøres:

Funksjonen tar antall sekunder som parameter, så…
..var det de pokkers sekundene da.

$dag   = 21;     // Dagen vi teller ned til 
$maaned = 12;      // Måned vi teller ned til 
$ar  = 2009;   // Året vi teller ned til 
$tidspunkt  = 23;     // Klokken (hele timer) vi teller ned til 
$sekunder_til_noe_skjer = ((mktime ($tidspunkt,0,0,$maaned,$dag,$ar)-time(void))); // sekunder

Og funksjonen kjøres:


Resultatet er en nedteller som gir et resultat i dette formatet:

3 måneder, 3 uker, 19 timer, 26 minutter, 3 sekunder

Og slikt liker vi.

PS: jeg har også lagt koden på snipplr, og du kan lese Aidans post om koden sin her.

Skrevet av

Eirik

Poster av denne "forfatteren" er fra min gamle blogger-blog. (men også den jeg stadig er logget inn med..)

4 kommentarer til «113 dager er 3 måneder og 3 uker»

  1. Først litt off-topic: Jeg tror du må velge en mørkere tekstfarge til kodeblokker, for hos meg er det nesten helt uleselig med lys tekst på lys bakgrunn.

    On-topic: NÃ¥r det gjelder behandling av tid i PHP, sÃ¥ er jeg ikke spesielt imponert over hvor mye (lite lesbar) kode som trengs for en sÃ¥ enkel funksjon… men det er uansett flott at du har gjort jobben enklere for oss andre som ikke jobber med PHP til daglig :)

  2. Off-topic: Tror også du må dobbeltsjekke tidssonen i WordPress for klokken er 12:05 hos meg nå (ikke 11:05).

  3. Det var mye off-topic :)
    Tidsssone-tingen er rettet. Skal se om jeg finner en fin syntax-highlight sak til koden…

    Takk for tilbakemeldingen!

  4. Det er en feil i koden her:

    $segment_name = substr($key, 0, -1);

    denne linjen fjerner flertalls s-en i weeks, months osv. I min versjon satt jeg den til å fjerne -er i minutter, måneder osv. Men: uker og timer fungerer ikke uten -er i entall, mens måned og sekund osv gjør det. Derfor har jeg lagt inn unntakshandtering av disse:


    if (($key == 'uker' && $value ==1)or($key == 'timer' && $value ==1)) {
    $segment_name = substr($key, 0, -1);
    } else {
    $segment_name = substr($key, 0, -2);
    }

    I disse tilfellene fjernes kun -r, slik at det blir uke og time, og ikke «uk» og «tim».

    koden på snipplr er oppdatert.

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *

Du kan bruke disse HTML-kodene og -egenskapene: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>