Redfern89
@Redfern89
Пишу код под МК AVR, начинающий сисадмин

PHP как получить порядковый номер дня?

Доброго времени суток! Как можно получить порядковый номер дня в диапазоне дат? getdate может только в пределах одного года. К примеру есть диапазон 10.11.2022 - 21.12.2023. И скажем нужен номер дня в дате 05.04.2023 из всего этого диапазона
  • Вопрос задан
  • 192 просмотра
Пригласить эксперта
Ответы на вопрос 5
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
date_default_timezone_set('Europe/Moscow');
$start = new DateTimeImmutable('10.11.2022');
$target = new DateTimeImmutable('05.04.2023');
$interval = $target->diff($start, true);
print $interval->days + 1;
// 147
Ответ написан
Комментировать
hint000
@hint000
у админа три руки
К примеру есть диапазон 10.11.2022 - 21.12.2023. И скажем нужен номер дня в дате 05.04.2023 из всего этого диапазона
Давайде что ли больше лет возьмём для лучшего понимания общего случая. Пусть начальная дата будет 10.11.2020. Тогда
= 1 - номер дня (10.11.2020)
+ номер дня (31.12.2020)
+ номер дня (31.12.2021)
+ номер дня (31.12.2022)
+ номер дня (05.04.2023)
Ну а на основании этого цикл по годам напишите самостоятельно,
spoiler
я последний раз на php писал в ~1998 г., лень гуглить синтаксис.

Почему вообще нужен цикл? Потому что в високосных годах на 1 день больше, а вычислять это формулой сложнее, чем через цикл. В случае жесткой оптимизации по скорости лучше заморочиться с формулой без цикла. В сущности, нужно умножить на 365 количество полных лет в промежутке и добавить количество високосных лет.
Заметьте, что конечная дата диапазона не используется и не влияет на вычисления.
Ответ написан
Комментировать
https://www.php.net/manual/en/class.dateinterval.php - создаёте объект интервала с параметром 1 день
https://www.php.net/manual/en/class.dateperiod.php - создаёте объект периода с датой до и после и с помощью метода getRecurrences() получаете кол-во дней
Ответ написан
mahmudchon
@mahmudchon
<?php
$start = '10.11.2022'; // Начало
$today = '05.04.2023'; // дата от начала
$seconds = strtotime($today) - strtotime($start); // секунд прошло с начала
$days = intval( $seconds / ( 24 * 60 * 60 ) ); // дней прошло
$day = $days + 1; // какой день пошел
echo $today . ' - это ' . $day . ' день начиная с ' .  $start;
// 05.04.2023 - это 147 день начиная с 10.11.2022
Ответ написан
$start_date = strtotime('2022-11-10'); // начальная дата
$target_date = strtotime('2023-04-05'); // конечная дата
$diff = ($target_date - $start_date) / (60 * 60 * 24); // Разница в днях 
$day_number = date('z', $target_date) + 1; // порядковый номер дня от начала года +1 потому что с 0
echo "Порядковый номер дня: {$day_number}";
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
YCLIENTS Москва
от 200 000 до 350 000 ₽
ИТЦ Аусферр Магнитогорск
от 100 000 до 160 000 ₽
Ведисофт Екатеринбург
от 25 000 ₽
25 апр. 2024, в 20:02
100000 руб./за проект
25 апр. 2024, в 19:42
49000 руб./за проект
25 апр. 2024, в 19:41
2000 руб./за проект