Comment calculer le décalage de date (fonction permettant de calculer les décalages) lors du passage à l'heure d'été ?
P粉919464207
P粉919464207 2023-09-16 00:03:57
0
1
525

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粉919464207
P粉919464207

répondre à tous(1)
P粉323224129

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.

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal