strptime() compatibility function ...
| From: | Jochem Maas | Date: | Wed, 26 Jul 2006 13:56:27 +0000 |
| Subject: | strptime() compatibility function ... | ||
| Groups: | php.general | ||
| Request: | Send a blank email to php-general+get-239815@lists.php.net to get a copy of this message | ||
out of frustration of needing and not having strptime() on certain machines [read: windows]
and on certain versions of php [read: pre5.1] I wrote a crude userland 'compat' function.
it works in so far as I have tested it... but it feels like a crap implementation,
my attempt is below, the question can anyone else to else do better (or has anyone already
done so?) - bare in mind that the real php strptime() is capable of producing very different
bullshit than mine is [if you want to see try this: var_dump(strptime("23:28:00",
"%H:%M:00"))]:
if (!function_exists('strptime')) {
function strptime($str, $fmt)
{
$rtn = array(
'tm_sec' => 0,
'tm_min' => 0,
'tm_hour' => 0,
'tm_mday' => 0,
'tm_mon' => 0,
'tm_year' => 0,
'tm_wday' => 0,
'tm_yday' => 0,
'unparsed' => ''
);
$valueBits = preg_split('#\W+#', $str);
$formatBits = array();
preg_match_all('#%[^%]#', $fmt, $formatBits);
foreach ($valueBits as $k => $v) {
if (!$v || !isset($formatBits[0][$k])) continue;
switch ($formatBits[0][$k]) {
case '%d':
case '%e':
$rtn['tm_mday'] = intval($v);
break;
case '%m':
$rtn['tm_mon'] = intval($v);
break;
case '%Y':
case '%y':
$i = intval($v);
if ($i < 100/*strlen(trim($v)) == 2*/)
$i += ($i > 29) ? 1900 : 2000;
$rtn['tm_year'] = $i;
break;
case '%b':
case '%B':
/*
// ER?? how to turn the month name
// (given in locale X) back into a month number?
// can't figure that out in less than 30 seconds,
// so forget about it :-/
$rtn['tm_mon'] = ??;
//*/
break;
case '%H':
case '%I':
case '%k':
case '%l':
$rtn['tm_hour'] = intval($v);
break;
case '%P':
case '%p':
if (stristr($v, 'pm')) {
$rtn['tm_hour'] += 12;
} else if (stristr($v, 'am')) {
$rtn['tm_hour'] -= 12;
}
break;
case '%M':
$rtn['tm_min'] = intval($v);
break;
}
}
return $rtn;
}
}