Salut, c'est le genre de problématique que j'aime bien, j'ai donc voulu m'y essayer.
En partant sur cette base :
Assaut 1 : Lundi (aujd) : 9h - durée : 4h
Assaut 2 : Mardi : 4h - durée 4h
Assaut 3 : Mardi : 23h - durée 4h
Assaut 4 : Mercredi 18h - durée 4h
on peut dire qu'il y a un assaut toutes les 19h.
Je suis donc parti sur ce principe un assaut toutes les 19h avec un assaut référence le 21 février à 18h.
Ma fonction, on peut surement faire mieux mais ça marche (la date par défaut sur la fonction c'est juste pour montrer le format attendu) :
function getDayAssaults(string $dayDate = '2024-02-22'): array
{
$referenceDate = new DateTime('2024-02-21 18:00');
$assaultDelayHours = 19;
$assaultDelaySecondes = $assaultDelayHours * 60 * 60;
$referenceTime = $referenceDate->getTimestamp();
$startRatio = ((new DateTime($dayDate . '00:00'))->getTimestamp() - $referenceTime) / $assaultDelaySecondes;
$endRatio = ((new DateTime($dayDate . '23:59'))->getTimestamp() - $referenceTime) / $assaultDelaySecondes;
$dayAssaults = [];
for ($i = floor($endRatio - floor(24 / $assaultDelayHours)); $i < $endRatio; $i++) {
$hour = floor((24 / ($endRatio - $startRatio)) * ($i - $startRatio));
if ($hour < 0) {
continue ;
}
$dayAssaults[] = new DateTime($dayDate . ' ' . $hour . ':00');
}
return $dayAssaults;
}
$oneDayInterval = new DateInterval('P1D');
$date = (new DateTime('2024-02-19'))->sub($oneDayInterval);
for ($i = 0; $i < 20; $i++) {
$dayDate = $date->add($oneDayInterval)->format('Y-m-d');
$dayAssaults = getDayAssaults($dayDate);
echo $dayAssaults[0]->format('l d F') . ' at ';
echo implode(' and ', array_map(static function ($assaultDate) {
return $assaultDate->format('H:i');
}, $dayAssaults)) . '.';
echo '<br/>';
}
/*
Résultat :
Monday 19 February at 09:00.
Tuesday 20 February at 04:00 and 23:00.
Wednesday 21 February at 18:00.
Thursday 22 February at 13:00.
Friday 23 February at 08:00.
Saturday 24 February at 03:00 and 22:00.
Sunday 25 February at 17:00.
Monday 26 February at 12:00.
Tuesday 27 February at 07:00.
Wednesday 28 February at 02:00 and 21:00.
Thursday 29 February at 16:00.
Friday 01 March at 11:00.
Saturday 02 March at 06:00.
Sunday 03 March at 01:00 and 20:00.
Monday 04 March at 15:00.
Tuesday 05 March at 10:00.
Wednesday 06 March at 05:00.
Thursday 07 March at 00:00 and 19:00.
Friday 08 March at 14:00.
Saturday 09 March at 09:00.
*/
Tu peux modifier le délai ou la date de référence et ça devrait toujours fonctionner.
En gros mon idée a été de me dire à combien de fois 19h suis-je au début et à la fin de la journée depuis la date de référence.
A partir de la, si par exemple au début de la journée, c'est à dire à minuit, je suis à 4,9 fois 19h ; alors quelle heure est-il à 5 fois 19h ? et si la fin de la journée est à plus de 6 fois 19h alors quelle heure est-il à 6 fois 19h ? C'est ce que permettent de faire la boucle et le calcul.
Salut, c'est le genre de problématique que j'aime bien, j'ai donc voulu m'y essayer.
En partant sur cette base :
Assaut 1 : Lundi (aujd) : 9h - durée : 4h
Assaut 2 : Mardi : 4h - durée 4h
Assaut 3 : Mardi : 23h - durée 4h
Assaut 4 : Mercredi 18h - durée 4h
on peut dire qu'il y a un assaut toutes les 19h.
Je suis donc parti sur ce principe un assaut toutes les 19h avec un assaut référence le 21 février à 18h.
Ma fonction, on peut surement faire mieux mais ça marche (la date par défaut sur la fonction c'est juste pour montrer le format attendu) :
[PHP]function getDayAssaults(string $dayDate = '2024-02-22'): array
{
$referenceDate = new DateTime('2024-02-21 18:00');
$assaultDelayHours = 19;
$assaultDelaySecondes = $assaultDelayHours * 60 * 60;
$referenceTime = $referenceDate->getTimestamp();
$startRatio = ((new DateTime($dayDate . '00:00'))->getTimestamp() - $referenceTime) / $assaultDelaySecondes;
$endRatio = ((new DateTime($dayDate . '23:59'))->getTimestamp() - $referenceTime) / $assaultDelaySecondes;
$dayAssaults = [];
for ($i = floor($endRatio - floor(24 / $assaultDelayHours)); $i < $endRatio; $i++) {
$hour = floor((24 / ($endRatio - $startRatio)) * ($i - $startRatio));
if ($hour < 0) {
continue ;
}
$dayAssaults[] = new DateTime($dayDate . ' ' . $hour . ':00');
}
return $dayAssaults;
}
$oneDayInterval = new DateInterval('P1D');
$date = (new DateTime('2024-02-19'))->sub($oneDayInterval);
for ($i = 0; $i < 20; $i++) {
$dayDate = $date->add($oneDayInterval)->format('Y-m-d');
$dayAssaults = getDayAssaults($dayDate);
echo $dayAssaults[0]->format('l d F') . ' at ';
echo implode(' and ', array_map(static function ($assaultDate) {
return $assaultDate->format('H:i');
}, $dayAssaults)) . '.';
echo '<br/>';
}
/*
Résultat :
Monday 19 February at 09:00.
Tuesday 20 February at 04:00 and 23:00.
Wednesday 21 February at 18:00.
Thursday 22 February at 13:00.
Friday 23 February at 08:00.
Saturday 24 February at 03:00 and 22:00.
Sunday 25 February at 17:00.
Monday 26 February at 12:00.
Tuesday 27 February at 07:00.
Wednesday 28 February at 02:00 and 21:00.
Thursday 29 February at 16:00.
Friday 01 March at 11:00.
Saturday 02 March at 06:00.
Sunday 03 March at 01:00 and 20:00.
Monday 04 March at 15:00.
Tuesday 05 March at 10:00.
Wednesday 06 March at 05:00.
Thursday 07 March at 00:00 and 19:00.
Friday 08 March at 14:00.
Saturday 09 March at 09:00.
*/
[/PHP]
Tu peux modifier le délai ou la date de référence et ça devrait toujours fonctionner.
En gros mon idée a été de me dire à combien de fois 19h suis-je au début et à la fin de la journée depuis la date de référence.
A partir de la, si par exemple au début de la journée, c'est à dire à minuit, je suis à 4,9 fois 19h ; alors quelle heure est-il à 5 fois 19h ? et si la fin de la journée est à plus de 6 fois 19h alors quelle heure est-il à 6 fois 19h ? C'est ce que permettent de faire la boucle et le calcul.