Aide pour créer un script

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Aide pour créer un script

Re: Aide pour créer un script

par Saian » 23 févr. 2024, 14:29

Désolé c'était trop tentant d'essayer et le "je souhaite juste une direction" m'a un peu échappé.

T'en étais où ? avais tu pensé à utiliser un assaut référence et les timestamp ? Si t'as compris la logique qu'a été la mienne c'est l'essentiel, bien que j'avoue c'est chouette de concrétiser par du code. Du coup je te remercie aussi car ça m'a bien diverti. ^^

Sinon "dernière" petite retouche, un DateTime en paramètre, je trouve ça quand même plus cohérent et y a pas d'histoire de sous quelle forme faut passer la date, c'est un DateTime point.
function getDayAssaults(DateTime $dayDate): array
{
    $referenceTime = (new DateTime('2024-02-21T18:00'))->getTimestamp();
    $assaultDelayTime = 19 * 60 * 60;

    $startRatio = (
        (new DateTime($dayDate->format('Y-m-dT00:00')))->getTimestamp() - $referenceTime
        ) / $assaultDelayTime;
    $endRatio = (
        (new DateTime($dayDate->format('Y-m-dT23:59')))->getTimestamp() - $referenceTime
        ) / $assaultDelayTime;

    $dayAssaults = [];
    for (
        $i = is_int($startRatio) ? $startRatio : ceil($startRatio);
        $i <= floor($endRatio);
        $i++
    ) {
        $dayAssaults[] = (new DateTime())->setTimestamp($i * $assaultDelayTime + $referenceTime);
    }

    return $dayAssaults;
}
On est dans la quintessence du code, simplicité, lisibilité, pas de fioriture. Comment ça j'ai le melon ?! 8-)

Re: Aide pour créer un script

par Foo » 23 févr. 2024, 08:23

Je ne voulais pas un travail tout fait, dommage car je voulais le faire par moi même.

M'enfin. C'est ce que je souhaitais. Donc grand merci pour ton aide, c'est modifié et intégré =)

Re: Aide pour créer un script

par Saian » 23 févr. 2024, 02:08

Oué j'ai nettoyé un peu le code et enlevé les variables inutiles et j'ai modifié ça au passage, rapport à ta remarque. ^^

Au final 8 instructions suffisent à résoudre la problématique et le code me semble assez lisible et compréhensible.

Re: Aide pour créer un script

par two3d » 22 févr. 2024, 21:02

Le T pour l'ISO correct, bien vu =D>

Re: Aide pour créer un script

par Saian » 22 févr. 2024, 19:34

Je dirais que c'est mieux mais ça fonctionne sans. ^^

Re: Aide pour créer un script

par two3d » 22 févr. 2024, 19:30

Te faut pas un espace avant les heures
((new DateTime($dayDate . '00:00')) //et 23:59 ? Comme ' 00:00'

Re: Aide pour créer un script

par Saian » 22 févr. 2024, 19:27

Merci two3d :D

Après relecture de ma logique je me suis dis mais c'est pas exactement ce que j'ai fait, pourquoi faire simple quand on peut faire compliqué ? Alors voilà la fonction simplifiée et qui suit véritablement la logique énoncée.
function getDayAssaults(string $dayDate = '2024-02-22'): array
{
    $referenceTime = (new DateTime('2024-02-21T18:00'))->getTimestamp();
    $assaultDelayTime = 19 * 60 * 60;

    $startRatio = (
        (new DateTime($dayDate . 'T00:00'))->getTimestamp() - $referenceTime
        ) / $assaultDelayTime;
    $endRatio = (
        (new DateTime($dayDate . 'T23:59'))->getTimestamp() - $referenceTime
        ) / $assaultDelayTime;

    $dayAssaults = [];
    for (
        $i = is_int($startRatio) ? $startRatio : ceil($startRatio);
        $i <= floor($endRatio);
        $i++
    ) {
        $dayAssaults[] = (new DateTime())->setTimestamp($i * $assaultDelayTime + $referenceTime);
    }

    return $dayAssaults;
}
Au final on boucle sur chaque entier compris entre les ratios de début et fin de journée et on a qu'à calculer le timestamp correspondant à l'entier en le multipliant par le nombres de secondes dans 19h et en y ajoutant le timestamp de la date de référence.

Re: Aide pour créer un script

par two3d » 22 févr. 2024, 19:00

=D>

Re: Aide pour créer un script

par Saian » 22 févr. 2024, 18:34

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.

Re: Aide pour créer un script

par two3d » 21 févr. 2024, 22:09

$date_a_incrementer = '2024-02-21 21:04';
$date_prochaine = date('Y-m-d H:i', strtotime('+12 hours', strtotime($date_a_incrementer)));
var_dump($date_a_incrementer, $date_prochaine);

Code : Tout sélectionner

C:\wamp64\www\test.php:6:string '2024-02-21 21:04' (length=16) C:\wamp64\www\test.php:6:string '2024-02-22 09:04' (length=16)

Re: Aide pour créer un script

par or 1 » 21 févr. 2024, 21:29

Re: Aide pour créer un script

par Foo » 21 févr. 2024, 21:22

C'est moi l'ai écrit, tout est en local, mais l'agenda en soit n'a aucune importance, en gros, ma question serai :

comment incrémenter une date, à partir d'une autre, toutes les 12h, et ajouter 4h ^^

Re: Aide pour créer un script

par two3d » 21 févr. 2024, 21:05

C'est un payant ? S'il est gratuit, je veux bien le lien pour que je regarde ce qu'on peut faire stp. ;)

Re: Aide pour créer un script

par Foo » 21 févr. 2024, 19:14

Et bien en PHP, évidement ^^

Re: Aide pour créer un script

par two3d » 20 févr. 2024, 17:59

D'accord. En quel langage il est codé cet agenda ?