2013-11-02 6 views
0

Трудно сформулировать проблему, которая у меня есть в названии, но вот сценарий: я работаю с бэкэндом 3-этажного экзамена на веб-сайте. В настоящее время я обновляю свою функцию, используемую, когда студенты просят сдавать экзамен. Экзамен имеет даты и время начала и окончания, а также временные ограничения. То, что я хочу сделать, относится к случаю, когда количество времени, оставшегося в экзаменационном периоде, меньше, чем срок для экзамена. Например, период экзамена заканчивается в 5:00 вечера. Время пришло время: 16:30. Срок действия экзамена составляет полтора часа. Я хочу заменить час и половину времени на 30 минут. Для этого есть 3 даты, которые мне нужны, и я объясню, как я получаю каждый:PHP DateTime Вычитание и преобразование

  • Временная метка для моей страницы функций. Когда контроллер вызывает мою страницу, после открытия сеанса я установил часовой пояс по умолчанию в Америку/Нью-Йорк (мой регион). Чтобы получить временную метку, я использую код:

    $ date = date ('Y-m-d H: i: s');

    $ currenttime = date ('H: i: s', strtotime ($ date));

  • Я использую вызов функции в своей базе данных для получения ограничения по времени и времени окончания экзамена (я также использую даты для других сравнений, чтобы проверить наличие экзамена). Время окончания экзамена сохраняется в результирующем массиве $ res [10], а ограничение времени - $ res [11].

  • Предполагая, что срок для экзамена равен дате отметки времени, и он находится в периоде экзамена (2 проверки, которые я выполняю раньше), я хочу проверить, не отличается ли разница между текущим временем и концом экзамена меньше срока. Если время до окончания экзамена меньше срока, я хочу установить такое количество времени в качестве нового временного ограничения. Мой фронт ожидает моего результата в форме HH: mm: ss (эквивалент php - H: i: s). Поэтому, если до окончания экзамена 30 минут, а срок составляет полтора часа, я хочу, чтобы новый временной интервал составлял 30 минут (или 00:30:00). В настоящий момент мой код не работает. Я отвечаю критериям для оператора if, что является моим желаемым результатом. Когда я конвертирую его в форму H: i: s, где проблема, кажется, (я получаю результат около 19:00:00). Каждая статья, которую я прочитал, предлагает сделать это таким образом, но я, возможно, что-то пропускаю.

    $compareTime = strtotime($res[10]) - strtotime($currenttime); 
    
    if(compareTime < strtotime($res[11]){ 
    
        $timelimit = date('H:i:s', $compareTime); 
    
    }else{ 
    
        $timelimit = $res[11]; 
    
    } 
    

Если есть лучший способ сделать это, я бы очень обязан знать. Я довольно новичок в php, и, по общему признанию, я понимаю, что это может быть странная проблема, но именно так решила группа.

+0

Я не думаю, что есть лучший способ, вы можете использовать классы Datetime, но я не думаю, что это будет необходимо лучше – jdog

+0

Я бы сделал все это через базу данных. Существует множество функций, позволяющих делать подобные вычисления, не беспокоясь о конверсиях. –

+0

[Вы проверили это] (http://php.net/manual/en/datetime.diff.php)? Не прочитал ваш полный вопрос. –

ответ

1

Возможно, это связано с тем, что база данных и сервер PHP используют разные временные интервалы. Проверьте это, напечатав эти переменные, чтобы увидеть их значения.

+0

Фактор базы данных, безусловно, кажется одним, который должен быть исключен из отладки в первую очередь. Я согласен с тем, что распечатка переменных приведет к большей ясности происходящего. Возможно, после попытки этого, @Eric также может попробовать код с некоторыми локально определенными значениями времени, а не по загрузке из БД. – perfectionist

+0

Чтобы убедиться, что я правильно использую strtotime(), я выполнял функцию для всех трех переменных отдельно, а затем использовал дату («H: i: s», strtotime (* любая переменная времени *)), чтобы проверьте, правильно ли оно преобразовано. Для всех 3 отдельных случаев я печатал оригинал, значение strtotime и обратное преобразование, и для всех трех человек он правильно преобразовывался.Это просто, когда я вычитаю два значения strtotime и пытаюсь преобразовать их, что вызывает проблему. –

+0

@perfectionist Я попытался использовать некоторые локальные переменные, чтобы проверить, что я правильно использую эту функцию, и снова проблема сохраняется после вычитания. У меня есть: $ time1 = strtotime ('15: 30: 00 ') - strtotime ('07: 15: 00'); , который дает 29700. Затем устанавливаем: $ time2 = date ('H: i: s', $ time1); , который выдается 03:15:00. Я ожидаю, что выход будет 08:15:00 (15:30:00 - 07:15:00). Правильно ли это предположение или я не понимаю природу этой функции? –

Смежные вопросы