1

因此,我有一个 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 小时。我究竟做错了什么?

4

7 回答 7

3

UNIX 时间戳不用于计算持续时间,它们表示自纪元(1970 年初)以来的特定时间,以秒为单位。如果您将非常低的值传递给诸如date()期望时间戳的函数,您将获得 1970 年代初期的日期。您必须手动进行时间格式化。

编辑:请注意,如果您居住在 GMT 时区,您将获得预期的结果。这是因为date()在计算时间戳生成的日期时会考虑您当前的时区。

于 2012-05-30T06:34:15.423 回答
1

只需将其格式化为可读字符串。

$duration = '30:13';
list($min, $sec) = explode(':', $duration);
echo "{$min}mins {$sec}s"; // 30mins 13s
于 2012-05-30T06:34:15.553 回答
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';
}
于 2012-05-30T06:37:42.863 回答
1

使用简单的正则表达式

function duration($str)
{
    return preg_replace('/^([0-9]{2})\:([0-9]{2}$)/', '$1 mins $2s', $str); 
}
echo duration("30:33");

输出

30 mins 33s

希望这对您有所帮助。谢谢!!

于 2012-05-30T06:39:18.830 回答
1

你可以试试 hh:mm:ss

list($hours,$mins,$secs) = explode(':', $yourtime);
echo $hours.' hours '.$mins .'minuts'. $secs .'seconds';

可以这样工作

于 2012-05-30T06:41:00.090 回答
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));
于 2012-05-30T06:42:39.680 回答
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');

我假设您使用的持续时间格式只有分钟和秒,当然如果您还需要几个小时,您可以修改代码。

于 2012-05-30T06:50:03.600 回答