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é ?
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 :
Sortie :
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.