Maison  >  Questions et réponses  >  le corps du texte

Comment calculer le décalage de date (fonction permettant de calculer les décalages) lors du passage à l'heure d'été ?

J'ai la fonction suivante pour déterminer quelle équipe travaille à une date donnée.

public static function getShift($date, $startDate, $sequence)
    {
        $daysDiff = floor((strtotime($date) - strtotime($startDate)) / (60 * 60 * 24));
        $sequenceArray = explode(',', $sequence);
        $key = ($daysDiff % count($sequenceArray)) + 1;
        return $sequenceArray[$key - 1];
    }

Il s'appelle ainsi :

$shift = ShiftHelper::getShift($date, '3/14/2023', '1,2,3,4');

Si j'utilise deux dates qui ne correspondent pas à l'heure d'été, cela semble bien fonctionner. Par exemple, le 14/03/2023 et le 22/06/23 renvoient 1 (correct). Mais si je couvre les jours où l'heure d'été se produit, comme le 10/03/23 et le 22/06/23, il renvoie 4, ce qui est le mauvais décalage.

Comment puis-je le faire fonctionner sans me soucier de l'heure d'été ?

P粉919464207P粉919464207370 Il y a quelques jours472

répondre à tous(1)je répondrai

  • P粉323224129

    P粉3232241292023-09-16 12:53:26

    C'est parce que votre calcul est basé sur le nombre de secondes dans une journée plutôt que sur le « nombre de jours ». Je parierais que dans la plupart des fuseaux horaires, mais pas dans tous, cela décalerait si légèrement les heures que cela franchirait la frontière et modifierait les chiffres de conversion. Je parierais également que le fuseau horaire de @aaronfc ne fonctionne pas comme ça, ou que son fuseau horaire par défaut est défini sur UTC ou sur un autre décalage statique.

    La bibliothèque DateTime peut calculer de manière fiable :

    function getShift($date, $startDate, $sequence) {
        $epoch = DateTime::createFromFormat('m/d/Y', $startDate)->setTime(0,0,0);
        $cur   = DateTime::createFromFormat('m/d/Y', $date)->setTime(0,0,0);
        $daysDiff = date_diff($epoch, $cur)->days;
        
        $sequenceArray = explode(',', $sequence);
        $key = ($daysDiff % count($sequenceArray)) + 1;
        return $sequenceArray[$key - 1];
    }
    
    var_dump(
        getShift('6/22/2023', '3/14/2023', '1,2,3,4'),
        getShift('6/22/2023', '3/10/2023', '1,2,3,4')
    );
    

    Sortie :

    string(1) "1"
    string(1) "1"

    Je recommande également de déplacer explode(',', $sequence)hors de la fonction afin que la fonction n'ait pas besoin de savoir comment décoder la chaîne arbitraire.

    répondre
    0
  • Annulerrépondre