我有多行时间
"42 sec"
"1 min"
"2 h 32 min"
是否可以将其转换为
"00:00:42"
"00:01:00"
"02:32:00"
用PHP填写?
答案 0 :(得分:7)
PHP的strtotime()
是一个有用的函数,可以将时间的字符串表示转换为unix时间戳。然后,我们可以将时间转换为我们喜欢的任何格式。
但是,您的原始时间字符串不是strtotime()
可以直接处理的格式。例如。 'h'必须是'小时'。但是如果您的数据一致,我们可能会在传递给strtotime()之前替换它们。
注意我们尝试将原始时间相对于0转换,而不是当前时间。
$rawTimes = array ('42 sec', '1 min', '2 h 32min');
foreach ($rawTimes as $rawTime) {
// Convert into a format that strtotime() can understand
$rawTime = str_replace('h','hour',$rawTime);
echo '"'.$rawTime.'" = "'.gmdate('H:i:s',strtotime($rawTime,0)).'"'."\n";
}
将输出:
"42 sec" = "00:00:42"
"1 min" = "00:01:00"
"2 hour 32min" = "02:32:00"
请注意strtotime()
了解'秒','秒','分钟','分钟'和'小时'。并且似乎处理空间或没有空间,例如。处理“32分钟”或“32分钟”。
答案 1 :(得分:1)
不是最干净的解决方案,但它适用于您的三种情况:
<?
$time[] = "42 sec";
$time[] = "1 min";
$time[] = "2 h 32min";
$seconds = '/([\d]{1,})\s?sec/';
$minutes = '/([\d]{1,})\s?min/';
$hours = '/([\d]{1,})\s?h/';
foreach( $time as $t )
{
echo '<br />';
preg_match( $hours, $t, $h );
$hour = $h[1];
if( $hour )
{
if( strlen( $hour )<2 )
$hour = '0' . $hour;
}
else
$hour = '00';
preg_match( $minutes, $t, $m );
$min = $m[1];
if( $min )
{
if( strlen( $min )<2 )
$min = '0' . $min;
}
else
$min = '00';
preg_match( $seconds, $t, $s );
$sec = $s[1];
if( $sec )
{
if( strlen( $sec )<2 )
$sec = '0' . $sec;
}
else
$sec = '00';
echo $hour . ':' . $min . ':' . $sec;
}
?>
输出:
00:00:42
00:01:00
02:32:00
答案 2 :(得分:0)
我很确定有一个更好的解决方案,但是那个有效。
function timetotime($str) {
$match = null;
if (preg_match("/(\d+)(\s?)h/", $str, &$match)) {
$h = $match[1];
if ($h < 10)
$result = "0{$h}:";
else
$result = "{$h}:";
} else
$result = "00:";
if (preg_match("/(\d+)(\s?)min/", $str, &$match)) {
$h = $match[1];
if ($h < 10)
$result .= "0{$h}:";
else
$result .= "{$h}:";
} else
$result .= "00:";
if (preg_match("/(\d+)(\s?)sec/", $str, &$match)) {
$h = $match[1];
if ($h < 10)
$result .= "0{$h}";
else
$result .= "{$h}";
} else
$result .= "00";
return $result;
}
答案 3 :(得分:-1)
http://php.net/manual/en/function.strtotime.php
<?php
$dates = array("42 sec", "1 min", "2 hour 32 min"); // normalise last item
foreach($dates as $d)
printf("%5s - %s\n", $d, nSecs($d));
function nSecs($date)
{
$t = strtotime("+1 day $date");
return $t - strtotime("+1 day");
}
?>
如果你可以将h => hour
标准化,那就没那么糟了。