Упражнения с датами PHP | Вычисление количества недель между двумя датами
Вычисление количества недель между двумя датами
Напишите сценарий PHP для расчета количества недель между двумя датами.
Пример вывода:
Пример
Попробуй сам »<?php
function week_between_two_dates($date1, $date2)
{
$first = DateTime::createFromFormat('m/d/Y', $date1);
$second = DateTime::createFromFormat('m/d/Y', $date2);
if($date1 > $date2) return week_between_two_dates($date2, $date1);
return floor($first->diff($second)->days/7);
}
$dt1 = '1/1/2020';
$dt2 = '12/31/2020';
echo 'С '.$dt1.' по '. $dt2. ' прошло '. week_between_two_dates($dt1, $dt2).' недели';
?>
Теория к упражнению:
DateTime::createFromFormat -- date_create_from_format — Разбирает строку с датой согласно указанному формату
Объектно-ориентированный стиль
public static DateTime::createFromFormat ( string $format , string $datetime , DateTimeZone|null $timezone = null ) : DateTime|false
Процедурный стиль
date_create_from_format ( string $format , string $datetime , DateTimeZone|null $timezone = null ) : DateTime|false
Возвращает новый объект DateTime, представляющий дату и время, заданные строкой datetime, которая была отформатирована в указанном
Список параметров
-
format -
Формат даты и времени в виде строки (string), которому соответствует значение второго аргумента функции. Список вариантов форматирования представлен ниже. В большинстве случаев, при форматировании используются те же символы, что и в функции date().
Список возможных символов для составления строки formatСимвол в строке formatОписание Возможные значения День --- --- dиjДень месяца, 2 цифры с нулём в начале или без него От 01до31либо от1до31DиlТекстовое представление дня месяца От MonдоSunлибо отSundayдоSaturdaySСуффикс для числа в английской нумерации, 2 буквы. Эти буквы будут пропущены при разборе строки. st,nd,rdилиth.zНомер дня с начала года (начиная с нуля) C 0по365Месяц --- --- FиMТекстовое представление месяца, например January или Sept С JanuaryпоDecemberлибо сJanпоDecmиnЧисловое представление месяца с первым нулём или без него С 01по12либо с1по12Год --- --- YПолное числовое представление года, 4 цифры Примеры: 1999или2003y2 цифры в представлении года (в диапазоне 1970-2069 включительно) Примеры: 99или03(будет расшифровано как1999и2003соответственно)Время --- --- aиAДо полудня и После полудня amилиpmgиh12-ти часовой формат времени с первым нулём или без него С 1по12либо с01по12GиH24-х часовой формат времени с нулём в начале или без него С 0по23или с00по23iМинуты с нулём в начале С 00по59sСекунды с нулём в начале От 00до59vМиллисекунды (до 3 цифр) Примеры: 12,345uМикросекунды (до 6 цифр) Примеры: 45,654321Временная зона --- --- e,O,PиTИдентификатор временной зоны, либо разница в часах относительно UTC, либо разница относительно UTC с двоеточием между часами и минутами, либо аббревиатура временной зоны Примеры: UTC,GMT,Atlantic/Azoresили+0200или+02:00илиEST,MDTДата/Время полностью --- --- UКоличество секунд с начала Эпохи Unix (January 1 1970 00:00:00 GMT) Пример: 1292177455Пробел и Разделители --- --- (пробел)Один пробел или один отступ табуляции Пример: #Один из следующих символов: ;,:,/,.,,,-,(или)Пример: /;,:,/,.,,,-,(или)Символ разделитель. Пример: -?Один случайный (любой) символ Пример: ^(Будьте внимательны: в UTF-8 кодировке вам может потребоваться более одного?, так как там один символ может занимать более одного байта. В таких случаях может помочь использование*.*Любое количество любых символов до следующего разделителя Пример: *вY-*-dдля строки2009-aWord-08будет соответствоватьaWord!Приводит значения всех полей (год, месяц, день, час, минута, секунда, временная зона) ко времени начала Эпохи Unix. Без !все поля будут соответствовать текущему времени.|Приводит значения незаданных полей (год, месяц, день, час, минута, секунда, временная зона) ко времени начала Эпохи Unix. Y-m-d|установит год, месяц и день в соответствии с данными в строке, а часы, минуты и секунды установит в 0.+Если задан этот спецификатор, данные, завершающие строку (нуль байт например) не будут вызывать ошибку, только предупреждение Используйте DateTime::getLastErrors() для определения, были ли в строке завершающие символы. Наличие в строке формата нераспознаваемых символов, отсутствующих в списке выше, приведёт к ошибке разбора строки. В этом случае сообщение об ошибке будет добавлено в возвращаемую структуру. Получить это сообщение можно с помощью функции DateTime::getLastErrors().
Для вставки в
formatбуквенного символа, вы должны экранировать его с помощью обратного слеша(\).Если
formatне содержит символ!, то значения полей, не заданных в строке формата, будут установлены в соответствии с текущим временем.Если
formatсодержит символ!, то значения полей, не заданных в строке формата (равно как и значения полей слева от!) будут установлены в соответствии со значениями полей начала Эпохи Unix.Начало эпохи Unix 1970-01-01 00:00:00 UTC.
-
datetime -
Строка, представляющая время.
-
timezone -
Объект класса DateTimeZone, представляющий ожидаемую временную зону.
Если
timezoneне указан илиnullиdatetimeне содержит временную зону, то будет использована текущая временная зона.Замечание:
Параметр
timezoneи текущая временная зона будут проигнорированы, если параметрdatetimeтакже содержит метку времени UNIX (то есть timestamp вида946684800) или же указанную временную зону (то есть2010-01-28T15:00:00+02:00).

Комментарии
<code>, несколько строчек кода — в теги<pre><code>...ваш код...</code></pre>.