Упражнения с датами 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
до31
D
иl
Текстовое представление дня месяца От Mon
доSun
либо отSunday
доSaturday
S
Суффикс для числа в английской нумерации, 2 буквы. Эти буквы будут пропущены при разборе строки. st
,nd
,rd
илиth
.z
Номер дня с начала года (начиная с нуля) C 0
по365
Месяц --- --- F
иM
Текстовое представление месяца, например January или Sept С January
поDecember
либо сJan
поDec
m
иn
Числовое представление месяца с первым нулём или без него С 01
по12
либо с1
по12
Год --- --- Y
Полное числовое представление года, 4 цифры Примеры: 1999
или2003
y
2 цифры в представлении года (в диапазоне 1970-2069 включительно) Примеры: 99
или03
(будет расшифровано как1999
и2003
соответственно)Время --- --- a
иA
До полудня и После полудня am
илиpm
g
иh
12-ти часовой формат времени с первым нулём или без него С 1
по12
либо с01
по12
G
иH
24-х часовой формат времени с нулём в начале или без него С 0
по23
или с00
по23
i
Минуты с нулём в начале С 00
по59
s
Секунды с нулём в начале От 00
до59
v
Миллисекунды (до 3 цифр) Примеры: 12
,345
u
Микросекунды (до 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>
.