в ближайшие 15 минут

моя таблица имеет столбец, который формируется в формате MySQL time() .
когда одно значение присваивается переменной PHP, называемой $ preRemainOt
я хочу организовать его в ближайшие 15 минут

function roundTime($whatTime)
{

echo $whatTime."=>";

$roundTime= round ( strtotime($whatTime)/60 * 15  );

echo date("H:i:s",$roundTime)."
"; return date("H:i:s",$roundTime); } $validOt =roundTime($preRemainOt);
few bad result given from my try as follow:
$preRemainOt=>$validO
    03:43:00=>06:55:45
    01:05:00=>06:16:15
    02:00:00=>06:30:00
but result shuld be as follow:
$preRemainOt=>$validO
    03:43:00=>03:45:00
    01:05:00=>01:00:00
    02:00:00=>02:00:00


1.pls give me an idea.
2.what happen if my remaining ot value($preRemainOt) exceed 24 hour ex:$preRemainOt='26:43:00' is that doesn't matter to either PHP or MySQL function.
what is the best MySQL data type to store such a ot calculation

update1
after few advices i spilt my function in to three section

function secondToTime($timeStamp)
{
        $hours=intval($timeStamp/3600);
        $mins=intval($timeStamp/60) % 60;
        $secs=$timeStamp % 60;
    return sprintf("%d:%02d:%02d",$hours, $mins, $secs);
}

function timeToSecond($time='00:00:00')
{
    list($hours, $mins, $secs) = explode(':', $time);
    $timeToSecond = ($hours * 3600 ) + ($mins * 60 ) + $secs;

    return $timeToSecond;
}

function roundTime($interval='00:00:00')
{
    $interval=timeToSecond($interval);
    $interval = intval($interval) + 450;
    $interval -= $interval % 900;
    return secondToTime($interval);
}

что, поскольку перед значением столбца, присваиваемым переменной $ preRemainOt , есть еще несколько шагов. Также меняем такие два шага,

function timeDiff($lastTime,$firstTime)
{
$firstTimetime=timeToSecond($firstTime);
$lastTime=timeToSecond($lastTime);
$timeDiff=$lastTime-$firstTime;

return secondToTime($timeDiff);
}

function timeAdd($firstTime,$lastTime)
{
$firstTimetime=timeToSecond($firstTime);
$lastTime=timeToSecond($lastTime);
$timeAdd=2*$lastTime-$firstTime;;
return secondToTime($timeAdd);
}

so i decided that it's dificult to use select UNIX_TIMESTAMP(). it would be change my whole script. in this case "%d:%02d:%02d" give nonsense

0
nl ja de
да. спасибо за внимание
добавлено автор kbitsoft, источник
1 день = 24 часа, и вы хотите сверхурочно (в день)> 1 день? hmm .. интересный ..
добавлено автор Fr0zenFyr, источник

1 ответы

Попробуй это:

function roundTime($whatTime) {
    $time = strtotime($whatTime) + 450;
    return date("H:i:s", $time - $time % 900);
}

<Сильный> Edit:

Собственно, на основе вашего комментария ниже, вот что я сделал бы. Если это временной интервал, а не буквальный момент времени, я бы сохранил значение в базе данных как целое число секунд вместо типа DATETIME. Таким образом, 30:37:29 будет храниться как 110249, так как 110249 секунд составляет 30 часов, 37 минут и 29 секунд.

Затем вместо того, чтобы передавать «30:37:29» этой функции, вы бы прошли 110249. Функция тогда будет:

function roundTime($interval) {
    $interval = intval($interval) + 450;
    $interval -= $interval % 900;
    return sprintf("%d:%02d:%02d",
        intval($interval/3600),      //hours
        intval($interval/60) % 60,   //minutes
        $interval % 60);               //seconds
}

Если вы уже сохранили кучу материала в базе данных и абсолютно не можете преобразовать его в секунды вместо DATETIME, тогда в вашем запросе вместо запроса DATETIME используйте функцию UNIX_TIMESTAMP вместе с функцией выше. Другими словами, вместо этого:

SELECT id, name, preRemainOt, other_stuff...

Сделай это:

SELECT id, name, UNIX_TIMESTAMP(preRemainOt) AS preRemainOt, other_stuff...

Затем передайте целочисленное значение этого столбца функции roundTime, а не значение DATETIME.

2
добавлено
хорошо, спасибо, можете ли вы объяснить, что такое $ time - $ time% 900, то это будет моей ошибкой
добавлено автор kbitsoft, источник
echo roundTime ('30: 37: 29 '); учитывая плохой ответ. Примечание. $ preRemainOt держит дополнение отработанного часа (ot). Это фактически не настоящее время clock.i означает, что время в часах не превышает '23: 59: 59 '
добавлено автор kbitsoft, источник
хорошо, я попробую еще раз спасибо
добавлено автор kbitsoft, источник
sprintf дает букву d из строки
добавлено автор kbitsoft, источник
Я обновил свою новую попытку. не ваш код вызывает ошибку. Однако измените его на «% d:% 0d:% 0d», он дал хороший результат
добавлено автор kbitsoft, источник
900 - это потому, что 15 минут - 900 секунд. Первая линия, добавляющая 450, эффективно округляет время, если вы больше, чем на 7.5 минут (450 секунд), на 15-минутный блок. Расчет $ time - $ time% 900 просто вычитает любой остаток, когда время делится на 15 минут, эффективно отбрасывая любые дополнительные минуты и секунды за 15-минутный знак.
добавлено автор King Skippus, источник
$ time% 900 дает вам количество секунд, прошедших с момента последней 15-минутной отметки. Вычитая это число из текущего времени, вы получаете отметку времени последней 15-минутной отметки. Например, в 3:45:02, $ time% 900 - 2 (на 2 секунды). Вычитание 2 секунд с 3:45:02 дает вам 3:45. В 3:46:00, $ time% 900 - 60 (60 секунд или одна минута). Вычитание 60 секунд с 3:46:00 снова дает вам 3:45. В 3:59:59, $ time & 900 - 899. И так далее.
добавлено автор King Skippus, источник
strtotime() не обрабатывает форматы, превышающие «23:59:59». Если вы этого хотите, вам нужно вручную проанализировать часы, минуты и секунды, возможно, используя регулярное выражение. Или еще лучше, если неважно, реализовано ли ваше решение в PHP или MySQL, вы должны вернуть UNIX_TIMESTAMP (date_column) из своей базы данных, а не только date_column и передать это число roundTime. Используйте $ whatTime вместо strtotime ($ whatTime), и он должен работать так, как вам нужно.
добавлено автор King Skippus, источник
Я отредактировал свой ответ выше, это может лучше соответствовать вашим потребностям. Дайте мне знать, как это работает.
добавлено автор King Skippus, источник
Вы разрешили проблему чуть выше? Спринтф отлично подходит для меня. Вы уверены, что положили знак% перед d? Кроме того, это нуль два d, а не буква O два d.
добавлено автор King Skippus, источник
phpGeeks
phpGeeks
3 620 участник(ов)

Best PHP chat Еще: @dbGeeks - базы данных @phpGeeksJunior - новичкам @moscowProgers - IT Москва @ebanoePhp - весёлый канал о PHP @laravel_pro - Laravel @jobGeeks - вакансии @jsChat - JS Правила: https://t.me/phpGeeks/764859 ДР - 28.03.2016

DBA - русскоговорящее сообщество
DBA - русскоговорящее сообщество
1 345 участник(ов)

Общаемся и обсуждаем темы, посвященные DBA, PostgreSQL, Redis, MongoDB, MySQL, neo4j, riak и т.д. См. также: @devops_ru, @kubernetes_ru, @docker_ru, @nodejs_ru Рекомендуем сразу отключить уведомления, чтобы пребывание здесь было полезным и комфортным.

PHP
PHP
1 309 участник(ов)

Группа про современный PHP. Обсуждаем ООП, TDD, BDD, DDD, SOLID, GRASP и прочие крутые базворды Для ознакомления: https://gist.github.com/mkusher/711bd46f0b62fbae851182e6fb3b1839 Группа PHP для новичков @phpGeeksJunior Вакансии: https://t.me/fordev

PHP — вакансии, поиск работы и аналитика
PHP — вакансии, поиск работы и аналитика
1 251 участник(ов)

Публикуем вакансии и запросы на поиск работы по направлению PHP, Laravel, Symfony, Yii и т.д. Здесь всё: full-time, part-time, remote и разовые подработки. См. также: @qa_jobs, @devops_jobs, @javascript_jobs, @nodejs_jobs, @uiux_jobs, @products_jobs

MySQL
MySQL
995 участник(ов)

The group is about MySQL. For code use hastebin.com. Admin: @smlkw

phpGeeksJunior
phpGeeksJunior
980 участник(ов)

Группа для новичков. Не стесняйтесь задавать вопросы по php. Не флудить!!!! Правила и полезные ссылки https://gist.github.com/exileed/a53dd0617b35a705ff44b38c8028e6a5 Бест от пхпгикс https://t.me/best_of_phpgeeks

phpclub.ru
phpclub.ru
872 участник(ов)

Официальный чат phpclub.ru - остерегайтесь подделок #rules Правила группы - уважайте друг друга. Скриншоты -> ссылками. Код -> pastebin.com. Вакансии строго -> https://goo.gl/4bNxym, в чат ссылку. За рекламу и мат - БАН!

Devall | PHP
Devall | PHP
272 участник(ов)

Пристанище для восходящих звёзд разработки, которые перейдут на более адекватные языки. http://combot.org/chat/-1001014863761 Инвайт: j.mp/devallphp