PAYATHON 2026

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() 更合适,因为它会按对象自身的时区设置时间。

备注:内容仅供参考。