Cakephp: время, разница не работает должным образом

#php #cakephp #time #timestamp

#php #cakephp #время #временная метка

Вопрос:

Я создаю приложение диспетчера задач, в котором пользователь может запускать / останавливать задачу. И я хочу знать, когда пользователь запустил его, когда остановил и как долго выполнялась задача.

В appcontroller.php я установил этот часовой пояс:

 date_default_timezone_set("Europe/Athens");
  

Но в taskscontroller.php , когда я сохраняю время, когда задача была запущена:

 $now = FrozenTime::now();
$task->date_start = $now;
  

Оно сохраняется в базе данных на 2 часа вперед (поле в базе данных имеет тип метки времени).Итак, когда я нажимаю начать в 9:00: 00, я вижу, что в базе данных это сохраняется как 11:00:00. То же самое, когда я нажимаю стоп:

     $now = FrozenTime::now(); 
    $task->date_end = $now;
  

Снова это сохранено на 2 часа вперед. Но в моем приложении, когда пользователь нажимает stop, я хочу рассчитать время, в течение которого выполнялась задача. Итак, я вычисляю следующим образом:

 $task->total_minutes = ($now->diff($task->date_start))->format('%i'); //minutes
  

Но даже несмотря на то, что date_start : 2019-03-18 11:43:47
и дата окончания: 2019-03-18 11:45:33

Я получаю total_minutes: 58, что явно неверно… Почему я получаю все эти ошибочные поведения?

Комментарии:

1. Пожалуйста, всегда указывайте точную версию CakePHP, которую вы используете, и в случае возникновения проблем с DB, также указывайте СУБД и ее версию — спасибо! Также, пожалуйста, постарайтесь предоставить воспроизводимые примеры, например, один фрагмент кода вместо 4, которые распределены по разным классам и действиям с данными из внешних источников, где никто не знает, вызываются ли / когда / как именно.

2. При этом, если вы используете MySQL, начните с использования DATETIME вместо TIMESTAMP , чтобы исключить преобразование часовых поясов, цитата: » MySQL преобразует значения временных меток из текущего часового пояса в UTC для хранения и обратно из UTC в текущий часовой пояс для извлечения. (Это не происходит для других типов, таких как DATETIME.) » dev.mysql.com/doc/refman/5.7/en/datetime.html . кстати, DateInterval объекты выдадут вам не общее количество минут, а оставшуюся часть временного интервала в минутах.

3. @netdev Просто небольшой совет, пожалуйста, имейте в виду разницу между вашим часовым поясом MySQL и вашим часовым поясом PHP. Для дальнейшего чтения нажмите здесь