note 65368 deleted from function.strtotime by derick
| From: | derick@php.net | Date: | Sun, 15 Jul 2007 12:39:05 +0000 |
| Subject: | note 65368 deleted from function.strtotime by derick | ||
| References: | 1 | Groups: | php.notes |
| Request: | Send a blank email to php-notes+get-128556@lists.php.net to get a copy of this message | ||
Note Submitter: francesco at pnpitalia dot it
----
modifies function of Jae Lee, this one support dates without separator like "20060401", it
return a "string" not a "timestamp"
<?php
/**
* Returns a formatted date from a string based on a given format
*
* Supported formats
*
* %Y - year as a decimal number including the century
* %m - month as a decimal number (range 1 to 12)
* %d - day of the month as a decimal number (range 1 to 31)
*
* %H - hour as decimal number using a 24-hour clock (range 0 to 23)
* %M - minute as decimal number
* %s - second as decimal number
* %u - microsec as decimal number
* @param string date string to convert to date
* @param string format expected format of the original date
* @return string rfc3339 w/o timezone YYYY-MM-DD YYYY-MM-DDThh:mm:ss YYYY-MM-DDThh:mm:ss.s
*/
function parseDate( $date, $format ) {
// Builds up date pattern from the given $format, keeping delimiters in place.
if( !preg_match_all( "/%([YmdHMsu])([^%])*/", $format, $formatTokens, PREG_SET_ORDER ) )
{
return false;
}
foreach( $formatTokens as $formatToken ) {
$delimiter = preg_quote( $formatToken[2], "/" );
if($formatToken[1] == 'Y') {
$datePattern .= '(.{1,4})'.$delimiter;
} elseif($formatToken[1] == 'u') {
$datePattern .= '(.{1,5})'.$delimiter;
} else {
$datePattern .= '(.{1,2})'.$delimiter;
}
}
// Splits up the given $date
if( !preg_match( "/".$datePattern."/", $date, $dateTokens) ) {
return false;
}
$dateSegments = array();
for($i = 0; $i < count($formatTokens); $i++) {
$dateSegments[$formatTokens[$i][1]] = $dateTokens[$i+1];
}
// Reformats the given $date into rfc3339
if( $dateSegments["Y"] && $dateSegments["m"] &&
$dateSegments["d"] ) {
if( ! checkdate ( $dateSegments["m"], $dateSegments["d"],
$dateSegments["Y"] )) { return false; }
$dateReformated =
str_pad($dateSegments["Y"], 4, '0', STR_PAD_LEFT)
."-".str_pad($dateSegments["m"], 2, '0', STR_PAD_LEFT)
."-".str_pad($dateSegments["d"], 2, '0', STR_PAD_LEFT);
} else {
return false;
}
if( $dateSegments["H"] && $dateSegments["M"] ) {
$dateReformated .=
"T".str_pad($dateSegments["H"], 2, '0', STR_PAD_LEFT)
.':'.str_pad($dateSegments["M"], 2, '0', STR_PAD_LEFT);
if( $dateSegments["s"] ) {
$dateReformated .=
":".str_pad($dateSegments["s"], 2, '0', STR_PAD_LEFT);
if( $dateSegments["u"] ) {
$dateReformated .=
'.'.str_pad($dateSegments["u"], 5, '0', STR_PAD_RIGHT);
}
}
}
return $dateReformated;
}
?>