为什么 PHP DateTime::setTime 会导致 strtotime 的奇怪行为?

Why does PHP DateTime::setTime causes weird behavior of strtotime?

我正在尝试更改几次日期并更正其时间。我找不到日期不想在 \DateTime::setTime 之后更改的原因。

$now = new \DateTime();

$nextFriday = new \DateTime('@' . strtotime('next friday', $now->getTimestamp()));

我得到:2019-03-21 23:00:00.0 +00:00

$nextFriday->setTime(12, 30);

我得到:2019-03-21 12:30:00.0 +00:00

$nextNextFriday = new \DateTime('@' . strtotime('next friday', $nextFriday->getTimestamp()));

现在,发生了什么:

2019-03-21 23:00:00.0 +00:00

我相信时间被重置的原因是相对 PHP 日期修饰符 'next ...' 总是将时间重置为实际 "beginning of next ...".

为什么你得到 23:00:00+00:00 可能是因为服务器和你的系统设置的时区不同(假设本地开发)。

如果您需要相对于日期使用:

<?php

$now = new \DateTime();

$nextFriday = clone $now;

$nextFriday->modify('next friday');
// also here time will be 00:00:00

$nextFriday->setTime(12,30);

var_dump($nextFriday);
// "2019-03-22 12:30:00.000000"