我试着寻找这个,但我找不到这个我想做的很好的例子。
我得到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();
可以使用date
和strtotime
功能功能来实现这一点,只需已经改变您的分钟和秒根据
$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"