Przejdź do treści

Data i czas po polsku („12 lipca 2026", „5 minut temu")

  • Przydatne narzędzia
  • poziom: początkujący
  • aktualizacja: 12 lipca 2026

PHP z pudełka wyświetli datę po angielsku, a naiwne tłumaczenie kończy się „12 lipiec 2026" zamiast „12 lipca 2026". Ten skrypt załatwia temat raz na zawsze: poprawne dopełniacze miesięcy, dni tygodnia i relatywny czas w stylu „5 minut temu" z pełną polską odmianą liczebników.

PHP 100 linii Pobierz .php
<?php
/**
 * Data i czas po polsku — skryptyPHP.com
 * Zapisz jako: daty.php i dołączaj przez require 'daty.php';
 */

date_default_timezone_set('Europe/Warsaw');

/**
 * Data po polsku: „12 lipca 2026" lub „niedziela, 12 lipca 2026".
 *
 * @param int|string|null $czas  timestamp, tekst daty (np. z bazy) albo null = teraz
 */
function data_po_polsku($czas = null, bool $zDniemTygodnia = false): string
{
    $miesiace = [
        1 => 'stycznia', 'lutego', 'marca', 'kwietnia', 'maja', 'czerwca',
        'lipca', 'sierpnia', 'września', 'października', 'listopada', 'grudnia',
    ];
    $dni = [
        1 => 'poniedziałek', 'wtorek', 'środa', 'czwartek',
        'piątek', 'sobota', 'niedziela',
    ];

    $t = match (true) {
        $czas === null     => time(),
        is_int($czas)      => $czas,
        default            => strtotime($czas) ?: time(),
    };

    $data = date('j', $t) . ' ' . $miesiace[(int) date('n', $t)] . ' ' . date('Y', $t);

    return $zDniemTygodnia
        ? $dni[(int) date('N', $t)] . ', ' . $data
        : $data;
}

/**
 * Polska odmiana liczebników: odmien(5, 'minuta', 'minuty', 'minut') -> 'minut'.
 */
function odmien(int $n, string $jeden, string $dwa, string $piec): string
{
    if ($n === 1) {
        return $jeden;
    }
    $r10  = $n % 10;
    $r100 = $n % 100;
    if ($r10 >= 2 && $r10 <= 4 && ($r100 < 12 || $r100 > 14)) {
        return $dwa; // 2-4, 22-24, ale nie 12-14
    }
    return $piec;
}

/**
 * Relatywny czas: „przed chwilą", „5 minut temu", „wczoraj"...
 */
function czas_temu($czas): string
{
    $t = is_int($czas) ? $czas : (strtotime((string) $czas) ?: time());
    $roznica = time() - $t;

    if ($roznica < 0)      { return data_po_polsku($t); } // data z przyszłości
    if ($roznica < 60)     { return 'przed chwilą'; }

    $minuty = intdiv($roznica, 60);
    if ($minuty < 60) {
        return $minuty . ' ' . odmien($minuty, 'minutę', 'minuty', 'minut') . ' temu';
    }

    $godziny = intdiv($minuty, 60);
    if ($godziny < 24) {
        return $godziny . ' ' . odmien($godziny, 'godzinę', 'godziny', 'godzin') . ' temu';
    }

    $dni = intdiv($godziny, 24);
    if ($dni === 1)  { return 'wczoraj'; }
    if ($dni === 2)  { return 'przedwczoraj'; }
    if ($dni < 31)   { return $dni . ' ' . odmien($dni, 'dzień', 'dni', 'dni') . ' temu'; }

    $miesiace = intdiv($dni, 30);
    if ($miesiace < 12) {
        return $miesiace . ' ' . odmien($miesiace, 'miesiąc', 'miesiące', 'miesięcy') . ' temu';
    }

    // Powyżej roku czytelniej pokazać pełną datę
    return data_po_polsku($t);
}

// ── PRZYKŁADY ───────────────────────────────────────────────
echo data_po_polsku();                    // 12 lipca 2026
echo "\n";
echo data_po_polsku(null, true);          // niedziela, 12 lipca 2026
echo "\n";
echo data_po_polsku('2026-05-01');        // 1 maja 2026 (np. data z bazy)
echo "\n";
echo czas_temu(time() - 300);             // 5 minut temu
echo "\n";
echo czas_temu(time() - 7200);            // 2 godziny temu
echo "\n";
echo czas_temu('2026-07-10 12:00:00');    // przedwczoraj

Jak użyć tego skryptu

  1. Zapisz funkcje w pliku daty.php i dołącz przez require tam, gdzie wyświetlasz daty.
  2. Daty z bazy (np. kolumna DATETIME) podawaj bezpośrednio: czas_temu($wiersz['dodano']).
  3. Funkcja odmien() przydaje się też poza datami — np. „3 komentarze", „7 plików": $n . ' ' . odmien($n, 'plik', 'pliki', 'plików').

Warto wiedzieć

  • Nazwy miesięcy są w dopełniaczu („lipca", nie „lipiec") — dokładnie tak, jak wymaga tego zapis daty po polsku.
  • Alternatywą jest klasa IntlDateFormatter z rozszerzenia intl, ale nie każdy hosting ma je włączone — ten skrypt działa wszędzie.
  • Strefa czasowa jest ustawiona na Europe/Warsaw — dzięki temu „5 minut temu" nie rozjedzie się o godzinę przy zmianie czasu letniego.
  • W przypadku dat w przyszłości czas_temu() bezpiecznie wraca do pełnej daty zamiast pokazywać ujemne wartości.
#data #czas #polska odmiana #czas temu #formatowanie

Podobne skrypty