Очень запутанная проблема с датой и временем - PullRequest
0 голосов
/ 28 марта 2019

Несмотря на то, что я давно работаю с php, эта проблема меня действительно смущает. Позвольте мне объяснить, что происходит. Предположим, я записываюсь на встречу для Клиента по адресу: 2019-03-31 10:00:00, и встреча будет длиться 15 минут, поэтому я добавляю эти 15 минут к времени начала встречи, которое равно 10:00:00, так что это будет: 10:15:00 время окончания встречи, теперь то, что происходит, "ТОЛЬКО" с датой: 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 ]

2 голосов
/ 28 марта 2019

Как уже упоминалось в 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');
0 голосов
/ 28 марта 2019

Я предполагаю, что это как-то связано с этой строкой прямо здесь:

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

Я бы мог var_dump часы и посмотреть, установлен ли он, затем проследить его обратно к тому месту, где он установлен.

...