23

我试图寻找这个,但我找不到我想要做的很好的例子。

我在 MySQL 数据库中得到了 datetime 值,在使用该值时必须向下舍入。

例如,所有这些值:

2013-04-20 07:14:42
2013-04-20 07:19:51
2013-04-20 07:37:26
2013-04-20 07:46:28
2013-04-20 07:59:44

应四舍五入为:

2013-04-20 07:00:00

2013-04-20 16:25:34

应该:

2013-04-20 16:00:00 等...

获取日期值的 PHP 代码:

$d = strtotime($row["date"]);

那么,如何舍入日期时间值呢?

4

11 回答 11

30

试试这个,

$date = "2013-04-20 16:25:34"; 
echo date("Y-m-d H:00:00",strtotime($date));

键盘演示。

于 2013-04-20T09:10:07.863 回答
22

如果您使用的是 PHP 的 Carbon DateTime 库(您确实应该使用它 - https://github.com/briannesbitt/Carbon

您可以使用轻松实现它

Carbon::now()->minute(0)->second(0);

于 2014-04-02T10:29:55.567 回答
10

由于您已经拥有 Unix 时间戳$d,因此最有效的方法是仅使用算术而不是日期函数 - 特别是如果您要遍历结果集。

$hourTimestamp = $d - ($d % 3600);

模运算符为您提供从时间戳中减去的余数以获得小时时间戳。

于 2015-11-03T18:56:07.823 回答
3

在这种情况下,一个简单的substr可以做到:

echo substr($date, 0, 13) . ":00:00";
于 2013-04-20T09:12:04.893 回答
1

您可以使用 函数功能datestrtotime实现这一点,只需更改您的分秒和秒针

    $date = '2013-04-20 07:14:42';
    $newdate = date('Y-m-d H:00:00', strtotime($date));

    echo $newdate;

这将输出

2013-04-20 07:00:00
于 2013-04-20T09:10:26.517 回答
1

00:00这通过直接输出分钟和秒而不是写入将日期写入字符串i:s

$date = date("Y-m-d H:00:00", $d);

或者你需要它作为unix时间戳吗?然后切断分钟和秒(总是最后 5 个字节)并将它们替换为00:00.

$d = strtotime(substr($row["date"], 0, -5)."00:00"));
于 2013-04-20T09:11:39.657 回答
1

strtotime()给你一个 Unix 时间戳,它是自 1970-01-01 00:00:00 以来的秒数。

如果只除以 3600 秒(秒等于 1 小时)并忽略余数(您想要的分钟和秒)怎么办?

$d = strtotime($row["date"]);
$rounded_d = intval($d / 3600);
$formatted_rounded_d = date('Y-m-d H:i:s', $rounded_d)
于 2013-04-20T09:15:29.403 回答
1

对于那些关注的人(很久以后!):Carbon 有一个简单的方法来做到这一点

$date = (new Carbon($row['date']))->minute(0)->second(0)->getTimestamp();
于 2016-04-27T08:00:09.080 回答
1

参考@Dayson 响应,这是使用 Carbon 将日期时间舍入到最后一小时的更好方法

$dt = Carbon::create(2012, 1, 31, 15, 32, 45);
echo $dt->startOfHour();  // 2012-01-31 15:00:00

检查Carbon Doc中的修饰符部分

于 2021-12-24T14:12:59.110 回答
0

我会setTime()在这样的函数中使用 DateTime 的方法。

<?php

/**
 * @param \DateTime $dateTime
 *
 * @return \DateTime
 */
function roundDownToHour(\DateTime $dateTime)
{
    $dt = $dateTime; // clone

    return $dt->setTime(
        $dateTime->format("H"),
        0,
        0
    );
}

$testDate = date("Y-m-d H:i:s", mktime(9, 59, 59, 1, 30, 2019));
$roundedDownToHour = roundDownToHour(new \DateTime($testDate));

var_dump($testDate); //=> 2019-01-30 9:59:59
var_dump($roundedDownToHour->format("Y-m-d H:i:s")); //=> 2019-01-30 09:00:00

结果如下。

// the results
string(19) "2019-01-30 09:59:59"
string(19) "2019-01-30 09:00:00"
于 2019-02-04T20:03:53.863 回答
-1

使用内置 PHP 函数进行舍入时间以考虑日期和时间是很重要的。例如2020-10-09 23:37:35需要2020-10-10 00:00:00在四舍五入到最接近的小时时变为。

循环时间到最近的时间

$time = '2020-10-09 23:37:35';

$time = date("Y-m-d H:i:s", round(strtotime($time) / 3600) * 3600); // 2020-10-10 00:00:00

$time = '2020-10-09 23:15:35';

$time = date("Y-m-d H:i:s", round(strtotime($time) / 3600) * 3600); // 2020-10-09 23:00:00

舍入到最近的 20 分钟增量

$time = '2020-10-09 23:15:35';

$time = date("Y-m-d H:i:s", ceil(strtotime($time) / (60*20))*(60*20)); // 2020-10-09 23:20:00

$time = '2020-10-09 23:41:35';

$time = date("Y-m-d H:i:s", ceil(strtotime($time) / (60*20))*(60*20)); // 2020-10-10 00:00:00

如果您需要四舍五入到最接近的 20 分钟增量,请更改ceilfloor例如

$time = date("Y-m-d H:i:s", floor(strtotime($time) / (60*20))*(60*20)); // 2020-10-09 23:40:00

如果您需要将时间四舍五入到另一分钟增量,您可以简单地执行以下操作:

$time = date("Y-m-d H:i:s", ceil(strtotime($time) / (60*15))*(60*15)); // 2020-10-09 23:45:00
于 2020-10-19T14:09:25.640 回答