http://www.zaachi.com/cs/items/php-slovni-vyjadreni-data.html

PHP: slovní vyjádření data

Publikováno: 27.03.2009 10:31:15

Pro PHP lze vymyslet více způsobů jak jednoduše zobrazit české názvy měsíců nebo dnů v operaci s datumy. Každý ze způsobů má určitě své výhody i nevýhody.

Dost častým problémem v PHP je vypsání českého data, kdy je třeba aby datum bylo vypsáno slovně. Na výstupu potřebujeme dostat takovýto řetězec:

čtvrtek, 24.červenec

Ukážeme si dva jednoduché způsoby, jak datum do takovéhoto tvaru dostat a pomocí PHP jej vypsat.

Nadefinování hodnot

První a pracnější způsob spočívá v nadefinování hodnot názvů, z nichž budeme hodnoty pro výpis čerpat. Způsobů jak hodnoty nadefinovat je spousta, nejjednodušší z nich je asi vytvořit si dvě pole pro měsíce a dny v týdnu. Z těchto hodnot polí potom už jednoduše získáme příslušné data.

//slovni definice jmen mesicu. Indexy pole zacinaji od 1
$months = array( 1 => 'Leden', 'Únor', 'Březen', 'Duben', 'Květen', 'Červen', 'Červenec', 'Srpen', 'Září', 'Říjen', 'Listipad', 'Prosinec');
//slovni definice jmen dnu v tydnu. Indexy pole zacinaji od 1
$days = array( 0 => 'Neděle', 'Pondělí', 'Úterý', 'Středa', 'Čtvrtek', 'Pátek', 'Sobota'); 

//zjisteni data pomoci getDate();
$date = getDate(time());
//vypis pozadovaneho formatu
print $days[ $date['wday'] ] . ', ' . $date['mday'] . '.' . $months[$date['mon']];

Jak je vidět, pro výpis jednoho data je tímto způsobem potřeba spousta zbytečného zdrojového kódu. Kód by šel určitě zefektivnit, ale to není podstatné a i tak je tento způsob zbytečně obsáhlý a pracný.

Představte si například situaci, kdy je udělána podpora pro několik jazyků a pro každý jazyk zvlášť by bylo potřeba slovní hodnoty definovat.

SetLocale

Druh, jednodušší způsob nám nabízí přímo PHP v podobě funkce SetLocale, pro nastavení lokálních informací:

string setlocale ( int $category , string $locale [, string $... ] )

Funkce obsahuje dvě vstupní proměnné, z nichž první je kategorie, jež representuje funkce, které budou pomocí SetLocale ovlivněny.

Jelikož pracujeme s daty a časovými údaji, bude nás samozřejmě zajímat kategorie LC_TIME, která ovlivní práci s funkcí strftime().

Druhý parametr funkce je řetězec reprezentující hodnotu, kterou chceme pro kategorii nastavit. V kombinaci s funkcí setLocale můžeme takto jednoduše dostat české názvy měsíců nebo dnů v týdnu.

Pomocí samotného strftime dostaneme námi požadovaný datum takto:

print strftime("%A, %d.%B",time() );

Tento způsob vrací anglické názvy:

Thursday, 24.July

Pokud chceme dosáhnout výpisu českých názvů, stačí pouze nastavit setLocale:

//odeslani hlavicek
header('Content-Type: text/html; charset=utf-8');
//nastaveni setLocale
setlocale(LC_TIME,'cs_CZ');
//vypis data
print strftime("%A, %d.%B",time() );

Tento způsob vrací datum v českém tvaru, ale bohužel funguje pouze pod Linuxem. V případě že potřebujeme vypisovat české data jak pod Linuxem tak pod Windows, musíme použít jiné klíčové slovo pro jeho nastavení:

//odeslani hlavicek
header('Content-Type: text/html; charset=utf-8');
//nastaveni setLocale
setlocale(LC_TIME,'czech');
//vypis data
print strftime("%A, %d.%B",time() );

Tento druhý způsob sice funguje jak pod operačním systémem Windows, tak pod OS Linux, ale bohužel nefunguje s UTF kódováním, ale vrací WINDOWS-1250.

V tomto případě máme dvě možnosti jak problém řešit, první z nich je převést zdrojový soubor do jiného kódování – WINDOWS-1250, ve kterém se názvy zobrazí správně:

//odeslani hlavicek
header('Content-Type: text/html; charset=windows-1250'); 
//nastaveni setLocale
setlocale(LC_TIME,'czech');
//vypis data
print strftime("%A, %d.%B",time() );

Druhá možnost je převést řetězec do UTF, pomocí funkce iconv:

//odeslani hlavicek
header('Content-Type: text/html; charset=utf-8');
//nastaveni setLocale
setlocale(LC_TIME,'czech');
//vypis data
print iconv("WINDOWS-1250", "UTF-8", strftime("%A, %d.%B",time()) );

Výhoda způsobu pomocí setLocale je v jednoduchém nastavení jazyků, kdy pouhým přepsáním jedné konstanty dosáhneme změny názvů všech hodnot.