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.
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.
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.