Občas je potřeba předem definovaný řetězec datumu přeformátovat na jiný datumový řetězec. Pokud máte timestamp (časová razítko) můžete ho předělat na datum pomocí date() dle potřeby. Pokud chcete z datumu udělat timestamp, slouží k tomu funkce mktime(). Konvertovat datum na jiný formát datumu je trochu složité a proto dole uvádím funkci, která by vám mohla ušetřit práci. Našel jsem ji v komentářích na php.net a trochu jsem ji doplnil a opatřil českými popiskami.
První parametr je jasný, vložíte string datumu. V druhém parametru zadáte vstupní formát datumu (v parametru 1) pomocí znakových zkratek uvedených u funkce date(), jiné tam bohužel nenacpete, leda že by jste funkci dále rozšířili (podělte se o kopii v komentářích). Do třetího parametru, který určuje výstupní formát už můžete nacpat znakové zkratky dle libosti.
< ?php
// 1 parametr = vstupní řetězec
// 2 parametr = formát vstupního řetězce
// 3 parametr = formát výstupního řetězce
function str2time($strStr, $strPattern = null, $newDate = null){
// pole časových znaků, viz: http://php.net/date#AEN21898
$arrCharacters = array(
'j', // den , 1 číslice
'd', // den , 2 číslice
'n', // měsíc, 1 číslice
'm', // měsíc, 2 číslice
'y', // rok, 2 číslice
'Y', // rok, 4 číslice
'G', // hodiny, 1 číslice
'H', // hodiny, 2 číslice
'i', // minuty
's' // sekundy
);
// transformuje časové pole do stringu
$strCharacters = implode('', $arrCharacters);
// rozdělí do pole vstupní formát datumu
$arrDelimiters = preg_split('~['.$strCharacters.']~', $strPattern);
// pole vstupního formátu zpracuje do stringu
$strDelimiters = quotemeta(implode('', array_unique($arrDelimiters)));
// rozdělí do pole vstupní řetězec podle vstupního formátu data
$arrStr = preg_split('~['.$strDelimiters.']~', $strStr);
// rozdělí do pole vstupní formát datumu
$arrPattern = preg_split('~['.$strDelimiters.']~', $strPattern);
// zkontroluje jestli jsou shodné vstupní datum a vstupní formát datumu
if (count($arrStr) !== count($arrPattern)) {
return false;
}
// do nového pole nacpe zadané hodnoty
$arrTime = array();
for ($i = 0;$i < count($arrStr);$i++) {
$arrTime[$arrPattern[$i]] = $arrStr[$i];
}
// dělá z dvoučíslicového datumu čtyřčíslový
if (isset($arrTime['y']) && !isset($arrTime['Y'])) {
$arrTime['Y'] = substr(date('Y'), 0, 2) . $arrTime['y'];
}
// dělá z měsíce v roce bez nuly dvojciferný s nulou
if (isset($arrTime['n']) && !isset($arrTime['m'])){
if(strlen($arrTime['n'])< 2 ){
$arrTime['m']='0'.$arrTime['n'];
}else{
$arrTime['m']=$arrTime['n'];
}
}
// dělá ze dne v měsíci bez nuly dvojciferný s nulou
if (isset($arrTime['j']) && !isset($arrTime['d'])){
if(strlen($arrTime['j'])< 2 ){
$arrTime['d']='0'.$arrTime['j'];
}else{
$arrTime['d']=$arrTime['j'];
}
}
// dělá z hodiny bez nuly hodinu s nulou
if (isset($arrTime['G']) && !isset($arrTime['H'])){
if(strlen($arrTime['G'])< 2 ){
$arrTime['H']='0'.$arrTime['G'];
}else{
$arrTime['H']=$arrTime['G'];
}
}
// když je deklarace prázdná naplní tam současný formát
foreach ($arrCharacters as $strCharacter) {
if (empty($arrTime[$strCharacter])) {
$arrTime[$strCharacter] = date($strCharacter);
}
}
// zkontroluje jestli datum je platný
if (!checkdate($arrTime['m'], $arrTime['d'], $arrTime['Y'])) {
return false;
}
// vytváří timestamp
$intTime = mktime($arrTime['H'], $arrTime['i'], $arrTime['s'], $arrTime['m'], $arrTime['d'], $arrTime['Y']);
$time=date($newDate, $intTime);
return $time;
}
// příklad
$time = str2time('6-7-08 07:58:02', 'j-n-y H:i:s','Y-m-d H:i');
echo $time;
?>