将日期时间舍入到最后一小时

时间:2013-04-20 09:06:47

标签: php datetime rounding

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

我在MySQL数据库中获得了日期时间值,当该值正在使用时,必须向下舍入。

示例,所有这些值:

  

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"]);

那么,如何才能将日期时间值向下舍入?

10 个答案:

答案 0 :(得分:23)

试试这个,

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

<强> CodePad Demo.

答案 1 :(得分:17)

如果你正在使用PHP的Carbon DateTime库(你真的应该 - https://github.com/briannesbitt/Carbon

您可以使用

轻松实现

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

答案 2 :(得分:4)

由于你已经有了一个Unix时间戳$d,最有效的方法是只使用算术而不是日期函数 - 特别是如果你要循环遍历结果集。

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

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

答案 3 :(得分:2)

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

echo substr($date, 0, 13) . ":00:00";

答案 4 :(得分:2)

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)

答案 5 :(得分: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

答案 6 :(得分: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"));

答案 7 :(得分:1)

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

$date = (new Carbon($row['date']))->minute(0)->second(0)->getTimestamp();

答案 8 :(得分:0)

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

<?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"

答案 9 :(得分:-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分钟增量,请将ceil更改为floor,例如

$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