Как на PHP по формату даты 00.00.0000 вывести текстом, типа «second saturday of february»?

Задавал вопрос "PHP относительные даты. Как обозначить например третий вторник месяца, или последний четверг месяца, или первый понедельник месяца?" (https://qna.habr.com/q/1116576)
Знатоки помогли, Благодарю.

Далее возник следующий вопрос - как теперь по дате типа 20.02.2022 вывести текст "second saturday of february" ???
или таких:
"last sunday of may"
"second sunday of september"
"first sunday of december"
"third friday of september"
"fourth sunday of july"
  • Вопрос задан
  • 147 просмотров
Пригласить эксперта
Ответы на вопрос 3
FanatPHP
@FanatPHP
Чебуратор тега РНР
В работе программиста важно полагаться не только на помощь посторонних людей, но и задействовать знания, полученные в средней школе, а так же здравый смысл.
В данном случае, несмотря на то что задача на первый взгляд пугающе сложная, её без труда решит сообразительный пятиклассник.
Надо просто повнимательнее посмотреть на дату.
Какая часть вызывает сложности?
Как получить день недели?
Как получить месяц?
Как посчитать сколько целых недель прошло до определенного числа с начала месяца?

Это же все смехотворные задачи, каждая из которых решается за 30 секунд

Ох, я забыл про last. Может быть, это и является арифметическим камнем преткновения? ;-)
Ответ написан
Комментировать
rozhnev
@rozhnev Куратор тега PHP
Fullstack programmer, DBA, медленно, дорого
Комментировать
Immortal_pony
@Immortal_pony Куратор тега PHP
function dateToText($date) {
    $monthOfYear = date("F Y", strtotime($date));
    $daysInMonth = date("d", strtotime("last day of {$monthOfYear}"));
    $dayOfMonth = date("d", strtotime($date));
    $dayOfWeek = date("N", strtotime($date));
    $occurance = 0;
    $maxOccurance = 0;

    foreach (range(1, $daysInMonth) as $day) {
        if (date("N", strtotime("{$day} {$monthOfYear}")) == $dayOfWeek) {
            $maxOccurance++;
            
            if ($day <= $dayOfMonth) {
                $occurance++;
            }
        }
    }
    
    $weekdayNumber = $occurance == $maxOccurance
        ? "last"
        : match($occurance) {
            1 => "first",
            2 => "second",
            3 => "third",
            4 => "fourth"
        }
    ;
    
    $text = $weekdayNumber . " " . date("l \\o\\f F", strtotime($date));
    
    return strtolower($text);
}
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы