- Алгоритм, считающий сколько дней прошло от определенной даты
- 2 ответа 2
- Как получить все дни между датами в PHP
- Количество дней между датами
- Формирование массива, содержащий все дни из интервала
- Результат:
- Функция на основе strtotime
- Результат:
- Разница между датами
- 3 ответа 3
- Операции с датами и временем Unixtime в PHP
- Получение временных меток и дат
- Число дня недели
- Числа месяца
- Текущий месяц:
- Преведущий месяц:
- Следующий месяц:
- Число дней в текущем месяце
- Порядковый номер недели
- Число дней в текущем году
- Текущий квартал
- Арифметические операции
- Прибавить к дате 10 секунд
- Прибавить к дате 10 минут
- Прибавить к дате 1 час
- Прибавить к дате 1 день
- Прибавить к дате неделю
- Прибавить к дате месяц
- Прибавить к дате год
- Сколько прошло
- Сколько прошло c 8:00
- Сколько прошло c понедельника этой недели
- Сколько прошло c начала года
- Сколько прошло c определённой даты
- Сколько остается
- Сколько остается до 23:00
- Сколько остается до конца недели
- Сколько остается до конца месяца
- Сколько остается до конца года
- Сколько остается до определенной даты
- Время между датами
- Количество часов между датами
- Количество дней между датами
- Количество месяцев между датами
- Комментарии 2
- Другие публикации
Алгоритм, считающий сколько дней прошло от определенной даты
Доброго всем времени суток. Есть ли у кого алгоритм, считающий сколько дней прошло от определенной даты? И есть ли у кого соображения, как это написать? Есть ли функции такие? На ум пришло только дни поделить на 365,25, месяцы на 12, а разницу в годах умножить на 365,25. но получается не точно. Хочется, что-то вроде:
2 ответа 2
$today = time(); $moon = mktime(0, 0, 0, 7, 21, 1969); echo "Америкосы были на луне ".floor(($today - $moon) / 86400)." дней назад.";
Ну это очень грубо. Хотя у меня тоже грубовато достаточно и не стал решения делать для дат которые меньше 1970 года. (Просто было лень.)
function vypiska($skolko, $chego) < global $array; if ($skolko == 0) $skolko = 10; if ($skolko == 1) $a = 3 * $chego + 1; if ($skolko >= 2 && $skolko = 5 && $skolko 20 && $skolko < 100) return vypiska($skolko % 10, $chego); if ($skolko >= 100) return vypiska($skolko % 100, $chego); return $array[$a]; > $array = array( "", "день", "дня", "дней", "месяц", "месяца", "месяцев", "год", "года", "лет" ); $std = $_GET['d']; $ed = mktime(0, 0, 0, date("m,d,Y")); $e = abs($ed - $std); $f = date('j-n-Y', $e); $dat = explode("-", $f); $day = $dat[0] - 1; $month = $dat[1] - 1; $year = $dat[2] - 1970; $soob = $text . " "; if ($year != 0) $soob = $soob . $year . " " . vypiska($year, 2); if ($year != 0 && $month != 0 && $day != 0) $soob = $soob . ", "; if ($year != 0 && $month != 0 && $day == 0) $soob = $soob . " и "; if ($month == 0 && $day != 0 && $year != 0) $soob = $soob . " и "; if ($month != 0) $soob = $soob . $month . " " . vypiska($month, 1); if ($month != 0 && $day != 0) $soob = $soob . " и "; if ($day != 0) $soob = $soob . $day . " " . vypiska($day, 0) . ".";
Как получить все дни между датами в PHP
Несколько примеров как найти все дни в промежутке между двумя датами в виде значения и списка.
Количество дней между датами
$date_1 = '28.03.2022 00:00'; $date_2 = '02.04.2022 23:59'; $seconds = abs(strtotime($date_1) - strtotime($date_2)); echo round($seconds / 86400, 1); // 6
$date_1 = '28.03.2022 00:00'; $date_2 = '02.04.2022 18:00'; $seconds = abs(strtotime($date_1) - strtotime($date_2)); echo round($seconds / 86400, 1); // 5.6
Формирование массива, содержащий все дни из интервала
Первый способ – использование классов DatePeriod, DateTime и DateInterval (доступны с версии PHP 5.3).
* Если в конечной дате не указать время (23:59), то в результирующем массиве не будет последнего дня.
$period = new DatePeriod( new DateTime('28.03.2022'), new DateInterval('P1D'), new DateTime('02.04.2022 23:59') ); $dates = array(); foreach ($period as $key => $value) < $dates[] = $value->format('d.m.Y'); > print_r($dates);
Результат:
Array ( [0] => 28.03.2022 [1] => 29.03.2022 [2] => 30.03.2022 [3] => 31.03.2022 [4] => 01.04.2022 [5] => 02.04.2022 )
Функция на основе strtotime
function get_dates($start, $end, $format = 'd.m.Y') < $day = 86400; $start = strtotime($start . ' -1 days'); $end = strtotime($end . ' +1 days'); $nums = round(($end - $start) / $day); $days = array(); for ($i = 1; $i < $nums; $i++) < $days[] = date($format, ($start + ($i * $day))); >return $days; > $dates = get_dates('28.03.2022', '02.04.2022'); print_r($dates);
Результат:
Array ( [0] => 28.03.2022 [1] => 29.03.2022 [2] => 30.03.2022 [3] => 31.03.2022 [4] => 01.04.2022 [5] => 02.04.2022 )
Разница между датами
Каким образом можно детально узнать разницу между двумя датами (сегодняшняя и некая, записанная в переменной) таким образом, чтобы результат был записан в 4 переменных: N лет, N месяцев, N часов, N минут? То есть, нужны именно 4 отдельных переменных для последующей работы с ними.
Надо перевести обе даты в UNIXTIME(), вычесть друг из друга. Полученное число — кол-во секунд между двумя датами. Далее в сети можно найти готовые функции, которые переводят занчение в секундах в нужные Вам 4 переменные
3 ответа 3
$now = new DateTime(); // текущее время на сервере $date = DateTime::createFromFormat("Y-m-d H:i", '2014-09-12 23:59'); // задаем дату в любом формате $interval = $now->diff($date); // получаем разницу в виде объекта DateInterval echo $interval->y, "\n"; // кол-во лет echo $interval->d, "\n"; // кол-во дней echo $interval->h, "\n"; // кол-во часов echo $interval->i, "\n"; // кол-во минут
\n добавлен только для удобства просмотра результатов, соответственно вместо echo присваиваем переменным или работаем напрямую со свойствами DateInterval
Мне пришлось писать функцию для себя, может кому понадобится:
function getPeriod($date1,$date2)< $interval = date_diff($date1, $date2); $y='';$m='';$d=''; if ($interval->y>0) < if ($interval->y>4) $y .=$interval->y . ' лет'; else if ($interval->y == 1) $y .=$interval->y . ' год'; else $y .=$interval->y . ' года'; $y .= ', '; > if ($interval->m>0) < if ($interval->m>4) $m .= $interval->m . ' месяцев'; else if ($interval->m>1) $m .= $interval->m . ' месяца'; else $m .= $interval->m . ' месяц'; $m .= ', '; > if ($interval->d>0) < if ($interval->d>4) $d .= $interval->d . ' дней'; else if ($interval->d>1) $d .= $interval->d . ' дня'; else $d .= $interval->d . ' день'; > return $y . $m . $d; >
$date1 = new DateTime('2001-01-1'); $date2 = new DateTime('2012-12-4'); $period = getPeriod($date1,$date2);
Операции с датами и временем Unixtime в PHP
Unix-время (англ. Unix time, также POSIX-время) — система описания моментов во времени. Определяется как количество секунд, прошедших с полуночи 1 января 1970 года.
В PHP текущую метку времени возвращает функция time() и функция strtotime(), также с unix-метками работает класс DateTime.
Получение временных меток и дат
Число дня недели
// Понедельник текущей недели: $time = strtotime('this week monday, 00:00'); echo date('d.m.Y H:i', $time); // 17.07.2023 00:00 // Понедельник предыдущий недели: $time = strtotime('previous week monday, 00:00'); echo date('d.m.Y H:i', $time); // 10.07.2023 00:00 // Понедельник следующей недели: $time = strtotime('next monday, 00:00'); echo date('d.m.Y H:i', $time); // 24.07.2023 00:00
Числа месяца
Текущий месяц:
// Первый день текущего месяца: $time = strtotime('first day of this month 00:00'); echo date('d.m.Y H:i:s', $time); // 01.07.2023 00:00:00 // Последний день текущего месяца: $time = strtotime('last day of this month 23:59'); echo date('d.m.Y H:i:s', $time); // 31.07.2023 23:59:00
Преведущий месяц:
// Первый день предыдущего месяца: $time = strtotime('first day of previous month 00:00'); echo date('d.m.Y H:i:s', $time); // 01.06.2023 00:00:00 // Последний день предыдущего месяца: $time = strtotime('last day of previous month 23:59'); echo date('d.m.Y H:i:s', $time); // 30.06.2023 23:59:00
Следующий месяц:
// Первый день следующего месяца: $time = strtotime('first day of next month 00:00'); echo date('d.m.Y H:i:s', $time); // 01.08.2023 00:00:00 // Последний день следующего месяца: $time = strtotime('last day of next month 23:59'); echo date('d.m.Y H:i:s', $time); // 31.08.2023 23:59:00
Число дней в текущем месяце
Порядковый номер недели
Число дней в текущем году
echo date('L') ? 366 : 365; // 365
Текущий квартал
echo intval((date('n') + 2) / 3); // 3
Арифметические операции
Для сложения и вычитания времени можно применить функцию strtotime() или просто работать с секундами:
1 минута | 60 секунд | 10 минут | 600 секунд |
1 час | 3600 секунд | 10 часов | 36000 секунд |
1 день | 86400 секунд | 2 дня | 172800 секунд |
1 неделя | 604800 секунд | 2 недели | 1209600 секунд |
1 месяц | 2629743 секунд | 2 месяца | 5259486 секунд |
1 год | 31556926 секунд | 2 года | 63072000 секунд |
Прибавить к дате 10 секунд
$time = time() + 10; echo date('d.m.Y H:i:s', $time); // 20.07.2023 04:10:54 /* или */ $time = strtotime('+10 seconds', time()); echo date('d.m.Y H:i:s', $time); // 20.07.2023 04:10:54
Прибавить к дате 10 минут
$time = time() + 600; echo date('d.m.Y H:i:s', $time); // 20.07.2023 04:20:44 /* или */ $time = strtotime('+10 minutes', time()); echo date('d.m.Y H:i:s', $time); // 20.07.2023 04:20:44
Прибавить к дате 1 час
$time = time() + 3600; echo date('d.m.Y H:i:s', $time); // 20.07.2023 05:10:44 /* или */ $time = strtotime('+1 hours', time()); echo date('d.m.Y H:i:s', $time); // 20.07.2023 05:10:44
Прибавить к дате 1 день
$time = time() + 86400; echo date('d.m.Y H:i:s', $time); // 21.07.2023 04:10:44 /* или */ $time = strtotime('+1 days', time()); echo date('d.m.Y H:i:s', $time); // 21.07.2023 04:10:44
Прибавить к дате неделю
$time = strtotime('+1 week', time()); echo date('d.m.Y H:i:s', $time); // 27.07.2023 04:10:44
Прибавить к дате месяц
$time = strtotime('+1 month', time()); echo date('d.m.Y H:i:s', $time); // 20.08.2023 04:10:44
Прибавить к дате год
$time = strtotime('+1 year', time()); echo date('d.m.Y H:i:s', $time); // 20.07.2024 04:10:44
Сколько прошло
Сколько прошло c 8:00
$date = date('d.m.Y 08:00'); $diff = time() - strtotime($date); echo round($diff / 3600, 1); // -3,8 часов
Сколько прошло c понедельника этой недели
$time = strtotime('monday'); $diff = time() - $time; echo round($diff / 3600); // 76 часов echo round($diff / 86400, 1); // 3,2 дней
*Дни недели: monday, tuesday, wednesday, thursday, friday, saturday, sunday.
Сколько прошло c начала года
$date = date('01.01.Y 00:00:00'); $diff = time() - strtotime($date); echo intval($diff / 86400); // 200 дней // или echo date('z'); // 200
Сколько прошло c определённой даты
$date = '10.08.2016'; $diff = time() - strtotime($date); echo round($diff / 3600); // 60844 часов echo round($diff / 86400); // 2535 дней
Сколько остается
Сколько остается до 23:00
$time = strtotime(date('d.m.Y 23:00')); $diff = $time - time(); echo round($diff / 3600, 1); // 18,8 часов
Сколько остается до конца недели
$date = strtotime('next sunday, 23:59'); $diff = $date - time(); echo round($diff / 3600); // 92 часов echo round($diff / 86400); // 4 дней
*Дни недели: monday, tuesday, wednesday, thursday, friday, saturday, sunday.
Сколько остается до конца месяца
$time = strtotime(date('Y-m-t 23:59')); $diff = $time - time(); echo round($diff / 3600); // 284 часов echo round($diff / 86400); // 12 дней
Сколько остается до конца года
$time = strtotime(date('Y-12-31 23:59')); $diff = $time - time(); echo round($diff / 3600); // 3956 часов echo round($diff / 86400); // 165 дней
Сколько остается до определенной даты
$date = '10.08.2025'; $diff = strtotime($date) - time(); echo round($diff / 3600); // 18044 часов echo round($diff / 86400); // 752 дней
Время между датами
Количество часов между датами
$date_1 = '01.01.2021 10:00'; $date_2 = '10.03.2021 18:00'; $seconds = abs(strtotime($date_1) - strtotime($date_2)); echo round($seconds / 3600); // 1640
Количество дней между датами
$date_1 = '01.01.2021 10:00'; $date_2 = '10.03.2021 18:00'; $seconds = abs(strtotime($date_1) - strtotime($date_2)); echo round($seconds / 86400, 1); // 68,3
Количество месяцев между датами
$date_1 = strtotime('01.01.2021 10:00'); $date_2 = strtotime('10.03.2021 18:00'); $months = 0; while (strtotime('+1 month', $date_1) < $date_2) < $months++; $date_1 = strtotime('+1 month', $date_1); >$days = round(($date_2 - $date_1) / (60 * 60 * 24)); echo $months . ' месяца, ' . $days . ' дней'; // 2 месяца, 9 дней
Комментарии 2
Специально не поленился и авторизовался, чтобы выразить благодарность авторам сайта, молодцы ребята! Неоднократно на вашем сайте получал именно нужную инфу, у вас все примеры разжеваны, с разными вариантами, не то что где нибудь найдешь вроде то, что тебе нужно и потом полдня думаешь, как под свою задачу это допилить. В данном случае мне нужно было кол-во дней между датами, при чем число должно быть дробным — то есть 3.6 дня, например. У вас нашел, скопировал, и вставил (только имена переменных поменял), все. Именно то, что нужно. И так бывало уже не раз. В общем, спасибо, и обязательно продолжайте в том же духе!
Авторизуйтесь, чтобы добавить комментарий.
Другие публикации
Заголовок Last-Modified помогает оптимизировать загрузку web-страниц и облегчить работу поисковым роботам.