Počeštění formátu data

Školení, která pořádám

Ve vícejazyčné aplikaci můžeme chtít pro každý jazyk nastavit jiný formát data. Slušné formátovací možnosti nabízí funkce strftime, která pro některá formátování vrací i textovou reprezentaci měsíce nebo dne v týdnu v jazyce nastaveném funkcí setlocale. Problém však nastává v případě, kdy pro daný jazyk nemá systém odpovídající překlad nebo když chceme používat překlady vlastní. Tehdy je možné formát data rozložit na jazykově závislé a nezávislé části a závislé přeložit vlastní funkcí:

<?php
/** Formátování data s přeložením textových částí funkcí lang()
* @param string formát stejný jako u funkce date()
* @param int timestamp nebo time() při neuvedení
* @return string zformátované a přeložené datum
* @copyright Jakub Vrána, https://php.vrana.cz/
*/
function date_lang($format, $timestamp = null) {
    if (!isset($timestamp)) {
        $timestamp = time();
    }
    $return = "";
    $rest = "";
    for ($i=0; $i < strlen($format); $i++) {
        if (strpos("DlSFMaAeT", $format[$i]) !== false) {
            $return .= (strlen($rest) ? date($rest, $timestamp) : "") . lang(date($format[$i], $timestamp));
            $rest = "";
        } else {
            $rest .= $format[$i];
        }
    }
    return $return . (strlen($rest) ? date($rest, $timestamp) : "");
}
?>

Aby se funkce date nemusela volat zbytečně mockrát, ukládá se jazykově nezávislý formát do proměnné $rest, na kterou se funkce zavolá až když to je potřeba. Volání po každém znaku by bylo jednodušší, ale neefektivnější.

Jakub Vrána, Řešení problému, 11.9.2006, diskuse: 5 (nové: 0)

Diskuse

bukaJ:

Nechápu význam $matches[4] na konci...

ikona Jakub Vrána OpenID:

Byl to omyl, odstranil jsem to.

Jindra:

Jsem sice zacatecnik, ale hodilo mi to 2 chyby: 1. nedefinovane $time (? chyba na radku č. 3 fce) a 2. nedefinovana fce lang(). poradi nekdo s fci lang()?

ikona Jakub Vrána OpenID:

1. Proměnná $time má být $timestamp – opravil jsem to.
2. Funkci lang() si sám nadefinuj – bude se starat o překlad.

Jarda:

Mám v INT počet dnů od 1.1.1970 jak dosáhnu výpisu datumu  prosím. Díky

Diskuse je zrušena z důvodu spamu.

avatar © 2005-2024 Jakub Vrána. Publikované texty můžete přetiskovat pouze se svolením autora. Ukázky kódu smíte používat s uvedením autora a URL tohoto webu bez dalších omezení Creative Commons. Můžeme si tykat. Skripty předpokládají nastavení: magic_quotes_gpc=Off, magic_quotes_runtime=Off, error_reporting=E_ALL & ~E_NOTICE a očekávají předchozí zavolání mysql_set_charset. Skripty by měly být funkční v PHP >= 4.3 a PHP >= 5.0.