PHP date()函数获取小时、分钟和秒,不带前导零。

6

可能有重复:
将秒转换为小时:分钟:秒

我一直在网上寻找一种好的方法将秒转换为不带前导零的分钟:秒。 我已经查看了这个问题,这是我甚至能够找到的唯一一个问题,但是那些答案都看起来不是很好。 也许它们是实现这一目标的唯一和最好的方法,但是我希望不是这样。

我已经做到了这一点,并且它给我没有前导零的分钟数,但我无法得到秒数。我能想到的唯一办法是进行一些数学和类似的操作,但是这似乎对于像这样简单的事情而言是非常麻烦的... 我不知道为什么PHP没有内置支持分钟和秒的功能...

intval(gmdate("i:s", $duration));

编辑 我想做的只是将视频中的秒数转换为H:M:S格式。


你需要intval()来做什么?为什么要加它? - zerkms
好的,这是我问题中另一个溢出问题的答案之一,它会删除零和其他所有内容。 - Dylan Cross
不是的。在应用函数之前,请阅读文档:http://php.net/intval - zerkms
就像我说的那样,这不是我自己应用的,而是在唯一的主题上有几个答案之一,并且如果我没记错的话,建议是这样做的。此外,我只是陈述它对我的日期所做的事情,即它删除了零和非数字值。 - Dylan Cross
就像我说的那样,这不是我自己应用的,而是唯一主题上为数不多的答案之一。更糟糕的是,这是程序员社区,而不是代码复制粘贴者的聚集地。 - zerkms
这不是那篇帖子的重复,我想要去掉前导零.. 那篇没有... - Dylan Cross
3个回答

2
implode(
    ':',
    array_map(
        function($i) { return intval($i, 10); },
        explode(':', gmdate('H:i:s', $duration))
    )
)

然而,如果小时等于0,则不要打印0:,只需有m:s。
preg_replace(
    '~^0:~',
    '', 
    implode(
        ':',
        array_map(
            function($i) { return intval($i, 10); },
            explode(':', gmdate('H:i:s', $duration))
        )
    )
)

做得好,把所有东西都放在一行里 :)。 - Mihai P.
谢谢,这确实产生了预期结果。 我没有问过这个,但是如果小时==0,则不要打印0:,只显示m:s。 - Dylan Cross
@Dylan Cross:请查看第二版。 - zerkms
1
对于所有小于86400秒的时间段 :) - Ja͢ck
2
其实...现在我感觉非常愚蠢,只需要做这个就足够了。后来我意识到,我实际上根本不想删除秒数前面的零。preg_replace('~^00:0~','', gmdate("H:i:s", $duration)); - Dylan Cross

2
我会采用迭代的方式来编写代码:
function duration_to_timestring($duration)
{
        $s = [];
        if ($duration > 3600) {
                $s[] = floor($duration / 3600);
                $duration %= 3600;
        }
        $s[] = floor($duration / 60);
        $s[] = floor($duration % 60);

        return join(':', $s);
}

这也不错,尽管我仍然无法理解为什么PHP没有包括没有前导零的分钟和秒。 - Dylan Cross
1
@DylanCross 只有特权人士知道为什么,也许他们用作格式说明符的有用字母用完了;-) - Ja͢ck

1

gmdate函数的第二个参数是一个时间戳。 你应该像这样做:

echo gmdate("H:i:s", mktime(0, 0, 0, 1, 1, 1998) + $duration);

intval 不应该出现在这里,因为你得到的是一个字符串,然后又将其转换为整数。使用 H:i:s 格式可以得到 10:40:05。
但如果持续时间大于 24 小时,则无法正常工作。


我想去掉前导零,但是上面的代码没有这样做。 - Dylan Cross
如果您想去掉前导零,则需要使用以下代码: $hours = date("h", mktime(0, 0, 0, 1, 1, 1998) + $duration); $minutes = intval(date("i", mktime(0, 0, 0, 1, 1, 1998) + $duration)); $seconds = intval(date("s", mktime(0, 0, 0, 1, 1, 1998) + $duration)); - Mihai P.
我编辑了我的代码,我有一种感觉你应该使用日期而不是gmdate。否则,现在的时间可能会根据服务器日期而不准确。 - Mihai P.
谢谢,唯一的问题是小时数应该为零,但在你编辑之前,它是五,现在变成了十二。 - Dylan Cross
你是对的,应该是 $hours = date("G", mktime(0, 0, 0, 1, 1, 1998) + $duration); - Mihai P.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接