日期和 strtotime 非常令人困惑的问题

Very confusing issue with date and strtotime

尽管我与 php 合作很长时间了,但现在这个问题让我很困惑。让我解释一下这是怎么回事,假设我正在为客户预约:2019-03-31 10:00:00 并且预约时间为 15 分钟,所以我要做的是将这 15 分钟添加到开始时间约会是 10:00:00,所以会变成:10:15:00 约会结束时间,现在发生的是 "ONLY",日期:2019-03-31 (31st only)日期功能在它应该的时间上增加了一个小时,而不是:10:15:00 它更改为:11:15:00,我确实检查了所有地方,此代码上方没有其他代码来更改小时我确实添加了以下确切的脚本主文件在同一服务器上的另一个文件中使用,并且在相同的日期和相同的时间下工作正常:

$txtstart_date = '2019-03-31';
$day_time = '10:00';
$hrmin = explode(":",$day_time);
$hours = '0';
$minut = '15';

$selected_date_time = new DateTime($txtstart_date.' '.$day_time.':00');
$selected_date_time = $selected_date_time->format('Y-m-d H:i:s');
$selected_hours = new DateTime($selected_date_time);
if($hours){
$selected_hours = $selected_hours->modify('+'.$hours.' hours');
}

if($minut){
    $selected_hours = $selected_hours->modify('+'.$minut.' minutes');
}
$selected_hours = $selected_hours->format('Y-m-d H:i:s');

echo date('Y-m-d H:i:s',strtotime($selected_hours));

如果有人能解开这里的疑惑就太好了。

我猜它与这里的这一行有关:

if($hours){
$selected_hours = $selected_hours->modify('+'.$hours.' hours');
}

我会 var_dump 小时看看它是否已设置,然后将其追溯到设置的位置。

正如 RiggsFolly 所说,问题可能出在夏令时。为了防止 PHP 做奇怪的事情,一步完成所有修改。因此,您跳过将字符串解析为日期的部分,将其格式化回字符串并再次将其解析为日期:

$txtstart_date = '2019-03-31';
$day_time = '10:00';
$hours = '0';
$minutes = '15';
$datetime = $txtstart_date . ' ' . $day_time;

echo DateTime::createFromFormat('Y-m-d H:i', $datetime)
    ->modify('+' . $hours . ' hour')
    ->modify('+' . $minutes . ' minute')
    ->format('Y-m-d H:i:s');

如果您需要两次相同的日期以便修改一个,只需克隆它即可:

$baseTime = DateTime::createFromFormat('Y-m-d H:i', $datetime);
$toBeModified = clone $baseTime;

echo $baseTime->format('Y-m-d H:i:s') . PHP_EOL;

echo $toBeModified
    ->modify('+' . $hours . ' hour')
    ->modify('+' . $minutes . ' minute')
    ->format('Y-m-d H:i:s') . PHP_EOL;

也可以更改 DateTime 对象使用的时区(当数据库中存储的日期为 utc 时,这在数据库上下文中非常有用):

echo DateTime::createFromFormat('Y-m-d H:i', $datetime, new DateTimeZone('Europe/London'))
    ->setTimezone(new DateTimeZone('UTC'))
    ->format('Y-m-d H:i:s');