Stavelin.com

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.

4 kommentarer

  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>