Jste-li vývojáři, může se vám hodit funkce pro získání slovního vyjádření uplynulého času (nebo zbývajícího času). Informace o uplynulém času, případně o času, který zbývá do nějaké události, se snáze uživatelům zpracovává, je-li vyjádřena slovně jako časový interval.
Představte si, že máte uživatelům zobrazit u jednotlivých akcí i kdy k těmto akcím došlo či dojde. Můžete samozřejmě zobrazit číselně datum a více se tím nezabývat:
14. dubna 2012 ve 13:30:15
Uživatelé by však jistě ocenili, kdyby nemuseli nad datumy přemýšlet a hned dokázali získat představu, kdy daná akce proběhla či proběhne. Zvláště kritické je informovat uživatele srozumitelnějším způsobem například v přehledech o objednávkách v e-shopech.
Ideální je proto zobrazit nejen datum, ale i slovní vyjádření:
včera
před 10 minutami
před týdnem
před měsícem
před 3 měsíci
za rok
za týden
za 10 minut
apod.
<?php /** ----------------------------------------------------------------------- * class CasovyInterval * Vrací slovní vyjádření uplynulého času nebo zbývajícího času * např.: před 5 minutami, před hodinou, před pěti hodinami, včera, před 3 dny, před týdnem, před měsícem, za minutu, za hodinu, ... * * @author Petr Franěk <franek.petr@seznam.cz> * @access public * @todo kontrola platnosti parametru $datum (např. pomocí preg_match) * * Příklad použití: * $datum = '2013-03-05 12:00:12'; * $t = new CasovyInterval; * echo $interval = $t->intervalSlovne($datum); // zobrazí uplynulý nebo zbývající čas slovně v češtině * echo $uplynulychDni = $t->pocetDni('2011-01-01') // zobrazí počet dní (číselně) od daného datumu * * Třída CasovyInterval nemá konstruktor. Nejde o objekt v pravém slova smyslu. Slouží pouze k zapouzdření funkcí. */ class CasovyInterval { /** ------------------------------------------------------------------------ * * Konvertuje DATE (YYYY-MM-DD) nebo DATETIME (YYYY-MM-DD hh:mm:ss) na slovní vyjádření uplynulého nebo zbývajícího času * * Vrací slovní vyjádření uplynulého nebo zbývajícího času * @param string datetime * @access public * @return string */ public function intervalSlovne($datum) { if( empty($datum) ) { return "Nebyl předán datum."; } $perioda = array("sekundy", "minuty", "hodiny", "dny", "týdny", "měsíce", "roky"); $delka = array("60","60","24","7","4.35","12"); $nyni = time(); $unixovy_datum = strtotime($datum); if( empty($unixovy_datum) ) { return "Chybný formát datumu."; } // minulý čas nebo budoucí čas? // if( $nyni > $unixovy_datum ) { $rozdil = $nyni - $unixovy_datum; $slovesnyCas = "před"; } else { $rozdil = $unixovy_datum - $nyni; $slovesnyCas = "za"; } for($j = 0; $rozdil >= $delka[$j] && $j < count($delka)-1; $j++) { $rozdil /= $delka[$j]; } $rozdil = round($rozdil); if( $slovesnyCas == "před" ) { switch ($perioda[$j]) { case "sekundy": if( $rozdil == 1 ) { $perioda[$j] = "sekundou"; $rozdil = "jednou"; }else{ $perioda[$j] = "sekundami"; } break; case "minuty": if( $rozdil == 1 ) { $perioda[$j] = "minutou"; $rozdil = ""; }else{ $perioda[$j] = "minutami"; } break; case "hodiny": if( $rozdil == 1 ) { $perioda[$j] = "hodinou"; $rozdil = ""; }else{ $perioda[$j] = "hodinami"; } break; case "dny": if( $rozdil == 1 ) { $perioda[$j] = "včera"; $rozdil = ""; $slovesnyCas = ""; }else{ $perioda[$j] = "dny"; } break; case "týdny": if( $rozdil == 1 ) { $perioda[$j] = "týdnem"; $rozdil = ""; }else{ $perioda[$j] = "týdny"; } break; case "měsíce": if( $rozdil == 1 ) { $perioda[$j] = "měsícem"; $rozdil = ""; }elseif( $rozdil == 12 ){ $perioda[$j] = "rokem"; $rozdil = ""; }else{ $perioda[$j] = "měsíci"; } break; case "roky": if( $rozdil == 1 ) { $perioda[$j] = "rokem"; $rozdil = ""; }else{ $perioda[$j] = "roky"; } break; default: break; } }else{ // "za ..." switch ($perioda[$j]) { case "sekundy": if( $rozdil == 1 ) { $perioda[$j] = "sekundu"; $rozdil = "jednu"; }else{ $perioda[$j] = "sekund"; } break; case "minuty": if( $rozdil == 1 ) { $perioda[$j] = "minutu"; $rozdil = ""; }else{ $perioda[$j] = "minut"; } break; case "hodiny": if( $rozdil == 1 ) { $perioda[$j] = "hodinu"; $rozdil = ""; }elseif( $rozdil >= 2 && $rozdil < 5){ $perioda[$j] = "hodiny"; }elseif( $rozdil >= 5 ){ $perioda[$j] = "hodin"; } break; case "dny": if( $rozdil == 1 ) { $perioda[$j] = "zítra"; $rozdil = ""; $slovesnyCas = ""; }else{ if( $rozdil > 1 && $rozdil < 5 ) { $perioda[$j] = "dny"; }else{ $perioda[$j] = "dní"; } } break; case "týdny": if( $rozdil == 1 ) { $perioda[$j] = "týden"; $rozdil = ""; }elseif( $rozdil == 2 ){ $perioda[$j] = "týden"; $rozdil = "příští"; }elseif( $rozdil > 2 && $rozdil < 5 ){ $perioda[$j] = "týdny"; }elseif( $rozdil >= 5 ){ $perioda[$j] = "týdnů"; } break; case "měsíce": if( $rozdil == 1 ) { $perioda[$j] = "měsíc"; $rozdil = ""; }elseif( $rozdil >= 2 && $rozdil < 5 ){ $perioda[$j] = "měsíce"; }elseif( $rozdil == 12 ){ $perioda[$j] = "rok"; $rozdil = ""; }elseif( $rozdil >= 5 ){ $perioda[$j] = "měsíců"; } break; case "roky": if( $rozdil == 1 ) { $perioda[$j] = "rok"; $rozdil = ""; }elseif( $rozdil == 2 ){ $perioda[$j] = "roky"; } break; default: break; } } return "{$slovesnyCas} $rozdil $perioda[$j]"; } /** ------------------------------------------------------------------------ * * Vrací počet dní od parametrem předaného datumu v mysql formátu ... YYYY-mm-dd nebo YYYY-mm-dd HH:ii:ss * * @param string datetime * @access public * @return integer */ public function pocetDni($datum = "") { $sekund = $this->datum_na_timestamp($datum); $rozdil = time() - $sekund; $dni = floor($rozdil / (60 * 60 * 24)); return $dni; } /** ------------------------------------------------------------------------ * * Konvertuje DATE (YYYY-MM-DD) nebo DATETIME (YYYY-MM-DD hh:mm:ss) na timestamp * * Vrací timestamp * @param string * @access private * @return integer */ private function datum_na_timestamp($datetime = "") { // použitelné pouze pro 10 nebo 19 znakové vyjádření ( 0000-00-00 nebo 0000-00-00 00:00:00 ) $delka = strlen($datetime); if(!($delka == 10 || $delka == 19)) { return false; } $datum = $datetime; $hours = 0; $minutes = 0; $seconds = 0; // DATETIME if($delka == 19) { list($datum, $time) = explode(" ", $datetime); list($hodin, $minut, $sekund) = explode(":", $time); } list($rok, $mesic, $den) = explode("-", $datum); return mktime($hodin, $minut, $sekund, $mesic, $den, $rok); } } // end class ?>
class.casovy_interval.zip – zdrojový soubor
Funkce zapouzdřeny do třídy CasovyInterval. Třídu můžete používat ve svých projektech.