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

时间:2019-03-28 19:18:26

标签: php date datetime 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));

如果有人能在这里消除疑问,那将是非常不错的。

2 个答案:

答案 0 :(得分:2)

正如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');

答案 1 :(得分:-1)

我猜这与这行有关:

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

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