- Операции с датами и временем Unixtime в PHP
- Получение временных меток и дат
- Число дня недели
- Числа месяца
- Текущий месяц:
- Преведущий месяц:
- Следующий месяц:
- Число дней в текущем месяце
- Порядковый номер недели
- Число дней в текущем году
- Текущий квартал
- Арифметические операции
- Прибавить к дате 10 секунд
- Прибавить к дате 10 минут
- Прибавить к дате 1 час
- Прибавить к дате 1 день
- Прибавить к дате неделю
- Прибавить к дате месяц
- Прибавить к дате год
- Сколько прошло
- Сколько прошло c 8:00
- Сколько прошло c понедельника этой недели
- Сколько прошло c начала года
- Сколько прошло c определённой даты
- Сколько остается
- Сколько остается до 23:00
- Сколько остается до конца недели
- Сколько остается до конца месяца
- Сколько остается до конца года
- Сколько остается до определенной даты
- Время между датами
- Количество часов между датами
- Количество дней между датами
- Количество месяцев между датами
- Комментарии 2
- Другие публикации
- Как узнать количество недель в месяц в PHP?
- 4 ответа
Операции с датами и временем 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); // 24.07.2023 00:00 // Понедельник предыдущий недели: $time = strtotime('previous week monday, 00:00'); echo date('d.m.Y H:i', $time); // 17.07.2023 00:00 // Понедельник следующей недели: $time = strtotime('next monday, 00:00'); echo date('d.m.Y H:i', $time); // 31.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); // 30.07.2023 02:00:56 /* или */ $time = strtotime('+10 seconds', time()); echo date('d.m.Y H:i:s', $time); // 30.07.2023 02:00:56
Прибавить к дате 10 минут
$time = time() + 600; echo date('d.m.Y H:i:s', $time); // 30.07.2023 02:10:46 /* или */ $time = strtotime('+10 minutes', time()); echo date('d.m.Y H:i:s', $time); // 30.07.2023 02:10:46
Прибавить к дате 1 час
$time = time() + 3600; echo date('d.m.Y H:i:s', $time); // 30.07.2023 03:00:46 /* или */ $time = strtotime('+1 hours', time()); echo date('d.m.Y H:i:s', $time); // 30.07.2023 03:00:46
Прибавить к дате 1 день
$time = time() + 86400; echo date('d.m.Y H:i:s', $time); // 31.07.2023 02:00:46 /* или */ $time = strtotime('+1 days', time()); echo date('d.m.Y H:i:s', $time); // 31.07.2023 02:00:46
Прибавить к дате неделю
$time = strtotime('+1 week', time()); echo date('d.m.Y H:i:s', $time); // 06.08.2023 02:00:46
Прибавить к дате месяц
$time = strtotime('+1 month', time()); echo date('d.m.Y H:i:s', $time); // 30.08.2023 02:00:46
Прибавить к дате год
$time = strtotime('+1 year', time()); echo date('d.m.Y H:i:s', $time); // 30.07.2024 02:00:46
Сколько прошло
Сколько прошло c 8:00
$date = date('d.m.Y 08:00'); $diff = time() - strtotime($date); echo round($diff / 3600, 1); // -6 часов
Сколько прошло c понедельника этой недели
$time = strtotime('monday'); $diff = time() - $time; echo round($diff / 3600); // 146 часов echo round($diff / 86400, 1); // 6,1 дней
*Дни недели: monday, tuesday, wednesday, thursday, friday, saturday, sunday.
Сколько прошло c начала года
$date = date('01.01.Y 00:00:00'); $diff = time() - strtotime($date); echo intval($diff / 86400); // 210 дней // или echo date('z'); // 210
Сколько прошло c определённой даты
$date = '10.08.2016'; $diff = time() - strtotime($date); echo round($diff / 3600); // 61082 часов echo round($diff / 86400); // 2545 дней
Сколько остается
Сколько остается до 23:00
$time = strtotime(date('d.m.Y 23:00')); $diff = $time - time(); echo round($diff / 3600, 1); // 21 часов
Сколько остается до конца недели
$date = strtotime('next sunday, 23:59'); $diff = $date - time(); echo round($diff / 3600); // 190 часов echo round($diff / 86400); // 8 дней
*Дни недели: monday, tuesday, wednesday, thursday, friday, saturday, sunday.
Сколько остается до конца месяца
$time = strtotime(date('Y-m-t 23:59')); $diff = $time - time(); echo round($diff / 3600); // 46 часов echo round($diff / 86400); // 2 дней
Сколько остается до конца года
$time = strtotime(date('Y-12-31 23:59')); $diff = $time - time(); echo round($diff / 3600); // 3718 часов echo round($diff / 86400); // 155 дней
Сколько остается до определенной даты
$date = '10.08.2025'; $diff = strtotime($date) - time(); echo round($diff / 3600); // 17806 часов echo round($diff / 86400); // 742 дней
Время между датами
Количество часов между датами
$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-страниц и облегчить работу поисковым роботам.
Как узнать количество недель в месяц в PHP?
Это внутри for петля, которая делает $week идти от 1 на количество недель в течение всего года.
Что я заметил, так это то, что в течение некоторых лет последний понедельник декабря по сравнению с предыдущим годом также включен туда, например: 29/12/2014 когда я выбираю 2015 в фильтре.
До сих пор, чтобы определить количество недель в месяце, я использовал программно подсчитывать количество понедельников в указанном месяце и использовал его в качестве colspan для строки над строкой дат, и, таким образом, для января не учитываются недели в течение нескольких лет, что делает смену стола.
Рендеринг HTML за год 2015 будет выглядеть так
January February [. ] 29/12/2014 05/01/2015 12/01/2015 19/01/2015 26/01/2015 02/02/2015 [. ] [. ]
И после поиска и тестирования большого количества счетчиков за неделю в месяце ни один из тех, что я обнаружил, похоже, не включал последний понедельник предыдущего года.
Может ли кто-нибудь узнать, как подсчитать недели, включая эту дополнительную неделю по сравнению с предыдущим годом?
4 ответа
Недавно сделал листинг довольно похожий на Carbon. Вот Snipped с некоторыми примерами вывода:
copy()->endOfYear(); $months = []; for (; $counter addWeek()) < // just to avoid E_NOTICE if (!isset($months[$counter->month])) < $months[$counter->month] = [ 'count' => 0, 'weekstarts' => [], ]; > ++$months[$counter->month]['count']; $months[$counter->month]['weekstarts'][] = $counter->copy(); > foreach ($months as $month) < printf('Month has %d weeks', $month['count']); echo PHP_EOL; foreach ($month['weekstarts'] as $num =>$weekStartDate) < printf('Week %d starts at %s', $num + 1, $weekStartDate); echo PHP_EOL; >echo PHP_EOL; >
Количество недель, приходящихся на данный месяц, в основном представляет собой количество дней в месяце плюс смещение, которое зависит от того, в какой день недели начался месяц, деленное на 7. Вот решение с использованием DateInterval и DatePeriod:
/** * Get number of weeks starting *Monday*, occuring in a given month. * A week occurs in a month if any day from that week falls in the month. * @param $month_date is expected to be DateTime. * @param $count_last count partial week at the end of month as part of month. */ function weeks_in_month($month_date, $count_last=true) < $fn = $count_last ? 'ceil' : 'floor'; $start = new DateTime($month_date->format('Y-m')); $days = (clone $start)->add(new DateInterval('P1M'))->diff($start)->days; $offset = $month_date->format('N') - 1; return $fn(($days + $offset)/7); > /** * Wrapper over weeks_in_month() to get weeks in month for each month of a given year. * @param $year_date is expected to be a DateTime. */ function year_month_weeks($year_date, $count_last=true) < $start = new DateTime($year_date->format('Y') . '-01'); $year_month_weeks = []; foreach(new DatePeriod($start, new DateInterval('P1M'), 11) as $month) < $year_month_weeks[] += weeks_in_month($month, $count_last); >return $year_month_weeks; > print_r(year_month_weeks(new DateTime('2008-01'), true));
Array ( [0] => 5 [1] => 5 [2] => 6 [3] => 5 [4] => 5 [5] => 6 [6] => 5 [7] => 5 [8] => 5 [9] => 5 [10] => 5 [11] => 5 )
Это можно проверить по результатам cal , Для первых 6 месяцев 2008 года должно быть 6 недель в марте, 5 июня для отдыха:
>ncal -Mb -m 1 -A 5 2008 2008 January February March Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su 1 2 3 4 5 6 1 2 3 1 2 7 8 9 10 11 12 13 4 5 6 7 8 9 10 3 4 5 6 7 8 9 14 15 16 17 18 19 20 11 12 13 14 15 16 17 10 11 12 13 14 15 16 21 22 23 24 25 26 27 18 19 20 21 22 23 24 17 18 19 20 21 22 23 28 29 30 31 25 26 27 28 29 24 25 26 27 28 29 30 31 April May June Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su 1 2 3 4 5 6 1 2 3 4 1 7 8 9 10 11 12 13 5 6 7 8 9 10 11 2 3 4 5 6 7 8 14 15 16 17 18 19 20 12 13 14 15 16 17 18 9 10 11 12 13 14 15 21 22 23 24 25 26 27 19 20 21 22 23 24 25 16 17 18 19 20 21 22 28 29 30 26 27 28 29 30 31 23 24 25 26 27 28 29 30