PHP 如何将日期时间向下取整到整点?
数据小陈
结论
对于 DateTimeImmutable,可以先用 format('G') 获取小时,再用 setTime() 将分钟和秒设为 0。例如,14:50:35 会变为 14:00:00。DateTimeImmutable 没有单独的小时 getter。
使用 DateTimeImmutable
<?php
$dateTime = new DateTimeImmutable(
'2024-05-01 14:50:35',
new DateTimeZone('Asia/Shanghai')
);
$hourStart = $dateTime->setTime(
(int) $dateTime->format('G'),
0,
0
);
echo $hourStart->format('Y-m-d H:i:s');
输出:
2024-05-01 14:00:00
format('G') 返回不带前导零的小时数,范围是 0 到 23。setTime() 会返回一个新的 DateTimeImmutable 对象,原对象不会改变;日期和时区也会保留。
使用 Unix 时间戳
如果要按 Unix 时间戳对应的整点取整,可以将秒数向下取整到 3600 的倍数:
<?php
$timestamp = 1714575035;
$hourStartTimestamp = (int) (floor($timestamp / 3600) * 3600);
$hourStart = (new DateTimeImmutable('@' . $hourStartTimestamp))
->setTimezone(new DateTimeZone('Asia/Shanghai'));
这种方式会按 Unix 时间轴上的小时边界取整,适用于目标边界与 Unix 时间戳的整小时一致的情况。如果要取特定时区的本地整点,直接使用 DateTimeImmutable::setTime() 更合适,因为它会按对象自身的时区设置时间。
备注:内容仅供参考。
