将 PHP 时间戳舍入到最接近的分钟

25

假设我有一个 PHP 中的 UNIX 时间戳。如何将 PHP 时间戳四舍五入到最近的一分钟?例如,将 16:45:34 转换成 16:45:00?

感谢您的帮助!:)


16:45:00 仍有秒... 我认为你的意思是要四舍五入到下一个最接近的分钟,而不是删去秒。 - Layke
我刚刚安装了PHP,所以我可以给你代码来完成它。我不想猜测,因为我讨厌time()。如果没有其他人回答,我将在10分钟内回答。 - Layke
4
@Laykes http://codepad.org/ 很适合快速检查代码。 - Yacoby
谢谢Laykes!Yacoby提供了我所需要的。我会编辑我的问题以使其更清晰。 - Lyon
@Yacoby:太酷了。我刚刚安装了一个WAMP堆栈。我已经将它加入书签了。 - Layke
16:45:34 会被四舍五入到最接近的一分钟,变成 16:46:00。 - Richard Knop
4个回答

65

如果时间戳是一个Unix风格的时间戳,那么只需

$rounded = round($time/60)*60;

如果是您所指示的样式,您可以将其简单地转换为Unix样式时间戳,然后再转回来。

$rounded = date('H:i:s', round(strtotime('16:45:34')/60)*60);

round()函数通常用于简单地保证在取值范围x - 0.5 <= x < x + 0.5时向x四舍五入。如果您总是想向下取整(如所示),可以使用floor()函数或模运算。

$rounded = floor($time/60)*60;
//or
$rounded = time() - time() % 60;

Yacoby,感谢您的全面解释!既然您提到了它,round()是我更喜欢的函数。在我的应用程序中更有意义。 :) - Lyon

6
这里有一个替代方案:
$t = time();
$t -= $t % 60;
echo $t;

我曾经阅读过一篇文章,它说在 PHP 中每次调用 time(),都需要通过整个栈返回到操作系统。但我不知道 5.3+ 版本是否有所改变。上面的代码可以减少对 time() 的调用...
基准测试代码:
$ php -r '$s = microtime(TRUE); for ($i = 0; $i < 10000000; $i++); $t = time(); $t -= $t %60; $e = microtime(TRUE); echo $e - $s . "\n\n";'

$ php -r '$s = microtime(TRUE); for ($i = 0; $i < 10000000; $i++); $t = time() - time() % 60; $e = microtime(TRUE); echo $e - $s . "\n\n";'

$ php -r '$s = microtime(TRUE); for ($i = 0; $i < 10000000; $i++); $t = floor(time() / 60) * 60; $e = microtime(TRUE); echo $e - $s . "\n\n";'

有趣的是,在超过10,000,000次迭代后,它们三个实际上需要相同的时间;)

2

0

只需使用以下代码:

$last_hour   = date('Y-m-d H:00:00') // to last hour;
$last_minute = date('Y-m-d H:i:00')  // to last minute;

我使用它来删除数据库中过期日期为 (+5分钟宽限期) 的旧购物车:
// clean expired shopping carts
function shop_clean_carts($grace = 5) {
    
    $expiry = date('Y-m-d H:i:00', strtotime("-$grace minutes"));
    $q      = "DELETE FROM `shop__cart` 
               WHERE `expiry` < '$expiry'
               AND `expiry` IS NOT NULL
               AND `fk_order_id` IS NULL";
    $db->query($q);
    
    return;
}

这比使用 mySql NOW() 更好,因为查询将被缓存。

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