Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailemVyřešeno PHP: převod data z 2007-08-29 na 29. srpen 2007

Zdravím,

nikde jsem tu nenašel odpověď na můj dotaz, tak zkusím nové téma...snad to tu pomůže i někomu jinému.

Pokouším se vytvořit si funkci pro převod z data 2007-08-29 na 29. srpen 2007, můj návrh:

function convert_date($date) {
// ošetření
if ( !ereg("[[:digit:]]{4}-[[:digit:]]{2}-[[:digit:]]{2 }",$date) ) return false;
else {
// získání českého měsíce
$months = array( 01 => 'leden', 'únor', 'březen', 'duben', 'květen', 'červen', 'červenec', 'srpen', 'září', 'říjen', 'listopad', 'prosinec' );
$mesic_cislo = ereg_replace("^([[:digit:]]{4})-0?([[:digit:]]{1,2 })-0?([[:digit:]]{1,2})$","\\2",$date);
$mesic = $months[$mesic_cislo];
// převod data
$date = ereg_replace("^([[:digit:]]{4})-0?([[:digit:]]{1,2 })-0?([[:digit:]]{1,2})$","\\3. $mesic \\1",$date);
// vrácení hodnoty
return $date;
}
}

Kód "prasečina", myslím, že by to šlo nějak zjednodušit pomocí preg_replace(), bohužel ji neumím používat, zkoušel jsem něco jako níže uvedený příklad, bohužel skončil chybou:

function convert_date($date) {
// ošetření
if ( !ereg("[[:digit:]]{4}-[[:digit:]]{2}-[[:digit:]]{2 }",$date) ) return false;
else {
// české měsíce
$months = array( 01 => 'leden', 'únor', 'březen', 'duben', 'květen', 'červen', 'červenec', 'srpen', 'září', 'říjen', 'listopad', 'prosinec' );
// převod
$date = preg_replace("^(\d{4})\\-0?(\d{1,2})\\-0?(\d{1,2}) $","\\3. $months[\\2] \\1",$date);
// vrácení hodnoty
return $date;
}
}

Mám ve zvyku za sebou nechávat co nejlepší kód, vím, že to musí jít přes preg_replace(), neví někdo jak ?
Kde najdu více info o funkci preg_replace() v češtině ?

Díky moc za odpovědi

Předmět Autor Datum
function vratDatumDnes() { $dny["Mon"] = "Pondělí"; $dny["Tue"] = "Úterý"; $dny["Wed"] = "Středa"; $…
Flash_Gordon 29.08.2007 18:37
Flash_Gordon
Asi bych se ereg_replace i preg_replace vyhnul, i když to je možná efektivní, ale zase se snadno udě…
host 29.08.2007 18:46
host
Supr, tak nějak jsem si to představoval, to je mnohem lepší. Použil jsem to od Hosta, jednoduché, př…
Kuncek 29.08.2007 19:52
Kuncek
...to je mnohem lepší. Do té doby, než sem napíše řešení los. ]:)
host 29.08.2007 20:00
host
No los je dobrý, ale myslíš, že to jde ještě efektivněji? :-)
Kuncek 29.08.2007 21:40
Kuncek
Ale jo, myslím, že by kód šel o něco více zestručnit nebo na převod použít jinou funkci, třeba ten r…
host 29.08.2007 21:43
host
Jo, to jo, já to předtím řešil ještě pomocí explode('-',$date), ale to je řekl bych dost amatérské,…
Kuncek 29.08.2007 21:53
Kuncek
Jo, pomocí explode to taky jde, je to asi o jeden řádek kratší... ;-) <?php function convert_date($…
host 29.08.2007 22:16
host
Ok, dík za link, manuál pročtu až když budu něco umět. Jinak to - $months[$date[1]*1] - tos vyřešil… poslední
Kuncek 29.08.2007 22:36
Kuncek
function vratDatumDnes()
{
$dny["Mon"] = "Pondělí";
$dny["Tue"] = "Úterý";
$dny["Wed"] = "Středa";
$dny["Thu"] = "Čtvrtek"; 
$dny["Fri"] = "Pátek"; 
$dny["Sat"] = "Sobota";
$dny["Sun"] = "Neděle";

$mesice = array(1=>"ledna", "února", "března",
"dubna", "května", "června",
"července", "srpna", "září",
"října", "listopadu", "prosince");

$dnes = $dny[Date("D")] . Date(" d. ") . 
$mesice[(int)Date("m")] . Date(" Y ");

return $dnes;
}




echo vratDatumDnes();

Asi bych se ereg_replace i preg_replace vyhnul, i když to je možná efektivní, ale zase se snadno udělá chyba a není na první pohled zřejmé, jak to funguje...

<?php
  function convert_date($date) {
    $months = array (1 => "leden", "únor", "březen", "duben", "květen", "červen", "červenec", "srpen", "září", "říjen", "listopad", "prosinec");
    $month = $months[date("n", strtotime("$date"))];
    $day = date("d", strtotime("$date"));
    $year = date("Y", strtotime("$date"));
    $date = $day.". ".$month." ".$year;
    return $date;
  }
  
  $datum = convert_date("2007-08-29");
  echo $datum;
?>

Jinak mrkni třeba sem: http://php.vrana.cz/prevod-data-z-ceskeho-formatu.p hp
Je to v podstatě řešený ten převod, na jaký ses ptal, jen opačně.

Jo, to jo, já to předtím řešil ještě pomocí explode('-',$date), ale to je řekl bych dost amatérské, když má PHP lepší funkce jako je třeba to date(), co jsi použil, nebo ty regulární výrazy.

Jo jinak vím, že PHP trošku pomaleji parsuje řetězec v uvozovkách, tak jsem tam hodil radši apostrofy, ale to je detail.

Nevíš prosím, kde bych našel něco víc o preg_replace() ? Hraju si na svém webu a u každého článku mi funkce rozpozná odkazy. Tady jsem našel zajímavý článek, ereg_replace není tak dobrá, a naučit se tu preg.. mi přijde celkem zajímavé.

Jo, pomocí explode to taky jde, je to asi o jeden řádek kratší... ;-)

<?php
  function convert_date($date) {
    $months = array (1 => "leden", "únor", "březen", "duben", "květen", "červen", "červenec", "srpen", "září", "říjen", "listopad", "prosinec");
    $date = explode("-", $date);
    $date = $date[2].". ".$months[$date[1]*1]." ".$date[0];
    return $date;
  }
  $datum = convert_date("2007-08-29");
  echo $datum;
?>

Na popis funkcí je nejlepší originál PHP manuál... V češtině bys něco našel třeba na Intervalu.
http://interval.cz/clanky/perl-compatible-regularni -vyrazy-v-php-subvyrazy-a-zpetna-reference/
http://www.regularnivyrazy.info/php-pcre-perl-compa tible.html

//edit: v mém prvním příspěvku jsem měl chybu - opravil jsem řádek s přiřazením proměnné $month

Ok, dík za link, manuál pročtu až když budu něco umět.

Jinak to - $months[$date[1]*1] - tos vyřešil dobře, nevěděl jsem jak se zbavit té nuly na začátku jinak než přes ereg_replace, dík.
Ale ta první verze je lepší ne? explode se mi tady moc nelíbí.

Jo a té chyb jsem si všiml těsně před tím, než jsem to přečetl, všude jsem měl srpen :-D

Zpět do poradny Odpovědět na původní otázku Nahoru