Å 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.
<?php /** * A function for making time periods readable * * @author Aidan Lister <aidan@php.net> * @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:
<?php echo time_duration($sekunder_til_noe_skjer); ?>
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.




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 :)
31 august, 2009 klokken 11:02
Off-topic: Tror også du må dobbeltsjekke tidssonen i WordPress for klokken er 12:05 hos meg nå (ikke 11:05).
31 august, 2009 klokken 11:06
Det var mye off-topic :)
Tidsssone-tingen er rettet. Skal se om jeg finner en fin syntax-highlight sak til koden…
Takk for tilbakemeldingen!
31 august, 2009 klokken 12:19
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.
14 september, 2009 klokken 12:44