Position actuelle: Accueil> Derniers articles> Comment résoudre le problème que les informations de fuseaurément horaire de la fonction de la fonction de temps de temps_endentifiers_list n'incluent pas l'heure d'été?

Comment résoudre le problème que les informations de fuseaurément horaire de la fonction de la fonction de temps de temps_endentifiers_list n'incluent pas l'heure d'été?

gitbox 2025-06-10

Dans PHP, la fonction Timezone_Identifiants_List () est utilisée pour obtenir une liste de tous les identificateurs de fuseau horaire connus, ce qui est pratique pour les développeurs à utiliser lors du traitement des fonctions de temps et de fuseau horaire. Cette fonction renvoie un tableau contenant des noms de fuseau horaire, tels que «Asie / Shanghai» , «Europe / Londres» , etc.

Cet article expliquera en détail la cause profonde de ce problème et comment déterminer et résoudre les programmatiques si l'heure d'été est prise en charge dans le fuseau horaire.


1. Problème Contexte

Timezone_Identifiants_list () répertorie simplement le nom du fuseau horaire, et il ne vous dit pas si le fuseau horaire est activé pour l'heure d'été. Par exemple, "Europe / Londres" aura des ajustements d'heure d'été, alors que "Asie / Shanghai" ne le fera pas. Vous ne pouvez pas distinguer la liste obtenue en utilisant simplement cette fonction.

Si vous utilisez ces chaînes de fuseau horaire directement pour faire des jugements de temps d'été, cela peut entraîner des erreurs de temps dans le programme pour changer l'heure d'été ou des calculs de temps invalides.


2. Solutions

Pour déterminer si un fuseau horaire prend en charge l'heure d'été, il est nécessaire de s'appuyer sur la coopération de la classe DateTimeZone de PHP et de la classe DateTime . L'idée est la suivante:

  1. Pour chaque identifiant de fuseau horaire, les objets temporels sont générés à deux moments: l'heure d'été (comme juillet) et l'heure d'hiver (comme janvier).

  2. Grâce à la méthode DateTimeZone :: getOffSet () , comparez si les compensations UTC à ces deux moments sont les mêmes.

  3. Si les décalages sont différents, cela signifie que le fuseau horaire prend en charge l'heure d'été; Sinon, il n'est pas pris en charge.


3. Exemple de code

Voici un exemple de code PHP qui montre comment filtrer une liste de fuseaux horaires qui prennent en charge l'heure d'été:

 <?php
$allTimezones = timezone_identifiers_list();

$dstTimezones = [];

foreach ($allTimezones as $timezone) {
    $tz = new DateTimeZone($timezone);

    // Prendre l&#39;hiver:1lune1jour
    $winter = new DateTime('2023-01-01', $tz);
    // Prendre un temps d&#39;été:7lune1jour
    $summer = new DateTime('2023-07-01', $tz);

    // Obtenez les secondes de décalage
    $winterOffset = $tz->getOffset($winter);
    $summerOffset = $tz->getOffset($summer);

    if ($winterOffset !== $summerOffset) {
        // Différents décalages,Indique qu&#39;il y a une heure d&#39;été
        $dstTimezones[] = $timezone;
    }
}

// Des fuseaux horaires de sortie qui prennent en charge l&#39;heure d&#39;été
echo "<pre>";
print_r($dstTimezones);
echo "</pre>";
?>

Ce code sortira tous les identificateurs de fuseau horaire contenant des ajustements de temps d'été, tels que "Europe / Londres" , "America / New_york" , etc.


4. Résumé

  • Timezone_Identifiants_list () ne peut obtenir qu'une liste de fuseau horaire et ne distingue pas si l'heure d'été est prise en charge.

  • En comparant les décalages UTC à différents moments du même fuseau horaire, il peut être jugé avec précision si l'heure d'été est activée.

  • En ce qui concerne les calculs de temps et les présentations à travers les fuseaux horaires, un jugement raisonnable sur le soutien à l'heure d'été peut éviter de nombreux problèmes de confusion de temps.

Grâce à cet article, les développeurs peuvent contrôler plus précisément la logique de traitement du temps pour s'assurer que le programme s'exécute toujours correctement pendant l'interrupteur d'heure d'été.