23. Datum a čas v PHP česky

Pokud potřebujeme, aby se datumové údaje vypisovaly česky, nestačí nám pouze vestavěná funkce PHP Date. Lze to vyřešit např. pomocí polí:

<html>
<head>
<meta charset="utf-8">
<title>Datum a čas v PHP česky</title>
</head>
<body bgcolor="#FFFFFF" text="#000000">
<center><font face="Arial CE, Arial" size="5">
<?php
$mesice = array ("ledna", "února", "března", "dubna", "května", "června", "července", "srpna", "září", "října", "listopadu", "prosince");

$den = array("neděle", "pondělí", "úterý", "středa", "čtvrtek", "pátek", "sobota");

echo "<h1>Datum a čas v PHP česky: </h1><p>Je " . $den[Date ("w")]. ", " . Date ("d") . ". ". $mesice[Date ("n") - 1] . " " . Date ("Y") . ", " . Date ("H:i:s") . "</p>";
?>
</font></center>
</body>
</html>

V nové verzi PHP 8.x lze tento problém vyřešit jednodušším kódem:

<?php
// Nastavíme český formátovač
$DenCesky = new IntlDateFormatter(
    'cs_CZ', 
    IntlDateFormatter::FULL, // Celý název dne
    IntlDateFormatter::MEDIUM // Čas (hodiny:minuty:sekundy)
);

// Nastavení vlastního vzoru pro přesný formát: "pondělí, 27. března 2026, 21:50:00"
$DenCesky->setPattern("eeee, d. MMMM y, H:mm:ss");

echo "<h1>Datum a čas v PHP česky: </h1>";
echo "<p>Je " . $DenCesky->format(new DateTime()) . "</p>";
?>

Vysvětlení značek v setPattern:

  • eeee = celý název dne (pondělí)
  • d. = den s tečkou
  • MMMM = název měsíce ve 2. pádě (března)
  • y = rok
  • H:mm:ss = čas

Uvedené řešení vyžaduje, aby byl na serveru spuštěno rozšíření intl.

Tady jsou ještě další verze, které existují:

<?php
// Vytvoříme objekt formátovače pro český jazyk
$fmt = new IntlDateFormatter('cs_CZ', IntlDateFormatter::NONE, IntlDateFormatter::NONE);
$ted = new DateTime();
// --- 1. VERZE: Klasický 2. pád (vhodné pro celé věty) ---
$fmt->setPattern("eeee d. MMMM yyyy, H:mm:ss");
echo "<strong>1. Kontextový formát (2. pád):</strong><br>
        <code>pattern: eeee d. MMMM yyyy</code><br>
        Dnes je: " . $fmt->format($ted)."<br><hr>";
// --- 2. VERZE: Nominativ / 1. pád (vhodné pro nadpisy) ---
$fmt->setPattern("d. LLLL yyyy");
echo "<strong>2. Samostatný formát (1. pád):</strong><br>
        <code>pattern: d. LLLL yyyy</code><br>
        Dnes je: " . $fmt->format($ted)."<br><hr>";
// --- 3. VERZE: Zkratky ---
$fmt->setPattern("eee d. MMM");
echo "<strong>3. Zkrácený formát:</strong><br>
        <code>pattern: eee d. MMM</code><br>
        Zkráceně: " . $fmt->format($ted)."<br><hr>";
// --- 4. VERZE: Pouze měsíce (Rozdíl M vs L) ---
$fmt->setPattern("MMMM");
$mesicM = $fmt->format($ted);
$fmt->setPattern("LLLL");
$mesicL = $fmt->format($ted)."<br>";
echo "<strong>4. Rozdíl mezi M a L samostatně:</strong><br>
        Písmeno M (kontextové): <code>" . $mesicM . "</code><br>
        Písmeno L (samostatné): <code>" . $mesicL . "</code>";
?>

Shrnutí:

  • MMMM: Používejte ve větách (vazba "dnes je [číslo] [měsíce]"). PHP pozná, že má skloňovat.
  • LLLL: Používejte, když měsíc stojí sám (např. výběr v kalendáři nebo nadpis).
  • eeee: Čtyři 'e' vypíší celý název dne (pondělí). Tři 'eee' vypíší 'po'.
  • Třída IntlDateFormatter je součástí rozšíření intl, které musí být na serveru povoleno.