@reds

Как преобразовать время в PHP?

Время хранится в формате: 2d 9h 40m

Мне нужно вычесть из него 20% и вывести результат. Что делать, подскажите?
  • Вопрос задан
  • 421 просмотр
Пригласить эксперта
Ответы на вопрос 4
SagePtr
@SagePtr
Еда - это святое
Перевести в минимальную единицу измерения (в вашем случае - в минуты), умножить на 0.8 и перевести в ваш формат обратно.
Ответ написан
Комментировать
GavriKos
@GavriKos
Переводите в количество секунд, вычитаете 20%, переводите обратно.
Методы перевода в секунды гуглятся.
Ответ написан
@reds Автор вопроса
Почти методом тыка написал функцию расчета секунд, надеюсь сервер не взорвется:

function seconds ($time){
$days = preg_match('/([\d])*d/', $time, $matches);
$days= ($matches[1])*86400;
$hours = preg_match('/([\d])*h/', $time, $matches);
$hours = ($matches[1])*3600;
$minutes = preg_match('/([\d])*m/', $time, $matches);
$minutes = ($matches[1])*60;
$secundes = preg_match('/([\d])*s/', $time, $matches);
$secundes = ($matches[1]);
$seconds = $days + $hours + $minutes + $secundes;
return $seconds;
}
Ответ написан
Комментировать
@bkosun
function seconds2times($seconds, $count_zero = TRUE, $output = 'years,days,hours,minutes,seconds')
    {

        // Normalize output
        $output = trim(strtolower((string)$output));

        if (!$output) {
            // Invalid output
            return FALSE;
        }

        // Array with the output formats
        $output = preg_split('/[^a-z]+/', $output);

        // Convert the list of outputs to an associative array
        $output = array_combine($output, array_fill(0, count($output), 0));

        // Make the output values into keys
        extract(array_flip($output), EXTR_SKIP);

        $times = [];

        // Seconds per minute | hour | day | year
        $periods = [60, 3600, 86400, 31556926,];

        for ($i = 3; $i >= 0; $i--) {
            $period = floor($seconds / $periods[$i]);
            if (($period > 0) || ($period == 0 && $count_zero)) {
                $times[$i + 1] = $period;
                $seconds -= $period * $periods[$i];

                $count_zero = TRUE;
            }
        }

        $times[0] = $seconds;

        $result = [];

        if (isset($output['years'])) {
            $result['years'] = $times[4];
        }

        if (isset($output['days'])) {
            $result['days'] = $times[3];
        }

        if (isset($output['hours'])) {
            $result['hours'] = $times[2];
        }

        if (isset($output['minutes'])) {
            $result['minutes'] = $times[1];
        }

        if (isset($output['seconds'])) {
            $result['seconds'] = $times[0];
        }

        return $result;
    }


$time = '2d 9h 40m';

        if (preg_match('/([\d]*)d\s([\d]*)h\s([\d]*)m/', $time, $matches)) {
            list($time, $days, $hours, $minutes) = $matches;

            $seconds = ($days * 86400) + ($hours * 3600) + ($minutes * 60);

            $seconds = $seconds - ($seconds / 100 * 20); // -20%

            print_r(seconds2times($seconds));
            // Array ( [years] => 0 [days] => 1 [hours] => 22 [minutes] => 8 [seconds] => 0 )
        }
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
YCLIENTS Москва
от 200 000 до 350 000 ₽
Ведисофт Екатеринбург
от 25 000 ₽
ИТЦ Аусферр Магнитогорск
от 100 000 до 160 000 ₽
24 апр. 2024, в 14:02
5000 руб./за проект
24 апр. 2024, в 13:45
15000 руб./за проект
24 апр. 2024, в 13:32
300 руб./за проект