把约会时间调到最后一小时


Round datetime to last hour

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

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

那么,如何舍入datetime值呢?

试试这个,

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

CodePad演示。

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

您可以使用

轻松实现

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

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

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

取模运算符给出从时间戳中减去的余数,得到小时时间戳

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

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

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

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

检查Carbon Doc

中的修饰符部分

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

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

可以使用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

直接将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"));

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)

使用内置的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

我会在这样的函数中使用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"