所以我有30:13(分钟:秒)格式的播客长度数组,我希望首先转换为有效的UNIX时间戳,然后将此时间戳格式化为可读的内容,如“30分钟13秒”。
我转换为时间戳功能如下所示:
public function duration($str) {
$a = explode(':', $str);
$v = (($a[0]*60)+$a[1]);
return $v;
}
当我尝试使用date('H:i:s', $v)
格式化这个问题时会产生问题,这会产生类似“17:35:50”的数字,而播客在17小时内无法播放。我做错了什么?
答案 0 :(得分:3)
UNIX时间戳不用于计算持续时间,它们表示自纪元(1970年初)以来的特定时间秒。如果您将一个非常低的值传递给期望时间戳的date()
等函数,您将获得1970年代早期的日期。你必须手动格式化时间。
修改:请注意,如果您居住在GMT时区,您将获得预期的结果。这是因为date()
在计算时间戳生成的日期时会考虑您当前的时区。
答案 1 :(得分:1)
将其格式化为可读字符串。
$duration = '30:13';
list($min, $sec) = explode(':', $duration);
echo "{$min}mins {$sec}s"; // 30mins 13s
答案 2 :(得分:1)
这应该可以完成你想要的工作。时间戳有所不同,请参阅http://en.wikipedia.org/wiki/Timestamp
// $str has the format 'mm:ss'
public function duration($str) {
list($min, $sec) = explode(':', $str);
return $min . ' mins ' . $sec . ' sec';
}
答案 3 :(得分:1)
使用简单正则表达式
function duration($str)
{
return preg_replace('/^([0-9]{2})\:([0-9]{2}$)/', '$1 mins $2s', $str);
}
echo duration("30:33");
输出
30 mins 33s
希望这会对你有所帮助。谢谢!
答案 4 :(得分:1)
你可以尝试hh:mm:ss
list($hours,$mins,$secs) = explode(':', $yourtime);
echo $hours.' hours '.$mins .'minuts'. $secs .'seconds';
这可行吗
答案 5 :(得分:1)
Unix时间戳为您提供从1970年1月1日00:00:00开始的秒数,但不是时间段。
为了完成你的任务,我会这样做:
$str = '30:13';
function duration($str) {
$a = explode(':', $str);
$hours = floor($a[0] / 60);
$minutes = $a[0] - $hours * 60;
$seconds = $a[1];
$result = '';
if($hours) {
$result .= "$hours hours ";
}
if($minutes) {
$result .= "$minutes minutes ";
}
return "$result$seconds seconds";
}
var_dump(duration($str));
答案 6 :(得分:1)
您可以使用DateInterval对象。
function getInterval($durationString) {
$parts = explode(':', $durationString);
$min = $parts[0];
$sec = $parts[1];
$interval = new DateInterval("PT{$min}M{$sec}S");
return $interval;
}
$interval = getInterval('30:12');
echo $interval->format('%imins %ss');
我假设您使用的持续时间格式只有几分钟和几秒,当然如果您还需要几个小时,也可以修改代码。