web-dev-qa-db-fra.com

Comment obtenir le réglage du fuseau horaire WordPress?

Quelqu'un peut-il me dire comment obtenir le fuseau horaire défini dans l'administrateur WordPress?

Par exemple, si le blog est défini sur l'heure normale de l'Est, j'ai besoin de cette chaîne exacte pour imprimer:

US/Est

Ceci est pour une fonction qui vit dans functions.php dans mon thème.

46
user1462

si vous avez besoin du gmt_offset alors

<?php echo get_option('gmt_offset'); ?>

cela vous donnera un entier comme 2 ou -2 .

et si vous avez besoin de la chaîne de fuseau horaire, utilisez

<?php echo get_option('timezone_string'); ?>

cela vous donnera une chaîne comme America/Indianapolis

75
Bainternet

Malheureusement, il existe deux options différentes:

  1. Le plus récent timezone_string, qui enregistre le fuseau horaire de style PHP.
  2. gmt_offset ancien, qui enregistre le décalage numérique flottant en heures.

Mais dans les environnements plus récents, timezone_string en fait remplace gmt_offset, la valeur renvoyée par ce dernier sera basée sur le premier. Cependant, le opposé n'est pas vrai - gmt_offset peut être valide, alors que timezone_string est vide.

J'ai passé pas mal de temps sur ces choses-là, et la prise la plus récente que j'ai implémentée dans ma WpDateTime library est la suivante:

class WpDateTimeZone extends \DateTimeZone {
    /**
     * Determine time zone from WordPress options and return as object.
     *
     * @return static
     */
    public static function getWpTimezone() {
        $timezone_string = get_option( 'timezone_string' );
        if ( ! empty( $timezone_string ) ) {
            return new static( $timezone_string );
        }
        $offset  = get_option( 'gmt_offset' );
        $hours   = (int) $offset;
        $minutes = abs( ( $offset - (int) $offset ) * 60 );
        $offset  = sprintf( '%+03d:%02d', $hours, $minutes );
        return new static( $offset );
    }
}

Cela tentera d'instancier un objet de fuseau horaire significatif dans tous les cas possibles, à condition que toute information soit disponible.

12
Rarst

Vérifiez la page Option Reference . L'option gmt_offset renvoie un entier. Par exemple, si le fuseau horaire est défini sur l'heure normale de l'Est (par exemple, America/New_York), gmt_offset doit être -5.

9
Travis Northcutt

Ne pensez pas que vous obtiendrez une chaîne du type US/Eastern sans stocker toutes les chaînes souhaitées dans un tableau et y faire référence. En utilisant PHP, vous pouvez obtenir l’abréviation du fuseau horaire, c’est-à-direEST; et si vous avez ces valeurs stockées dans un tableau avec les chaînes que vous voulez, vous pouvez les rechercher.

<?php date_default_timezone_set(get_option('timezone_string'));

      echo date('T'); // will give you three-character string like "EST"

      $timezones = array (
          'EST' => 'US/Eastern',
          'CST' => 'US/Central',
          // etc, etc, etc.
          );

      echo $timezones [ date('T') ]; // should be what you want.
 ?>
2
goldenapples

Pour ajouter à Bainternet (j'ajoute ceci comme réponse car je ne peux pas commenter - j'ai moins de 50 points sur WP pile de développement).

WordPress ne stockera une chaîne de fuseau horaire que si vous sélectionnez une chaîne de fuseau horaire dans les paramètres généraux. La sélection UTF correspond aux valeurs par défaut de la liste, mais vous pouvez faire défiler les chaînes jusqu'au fuseau horaire. Si vous définissez une chaîne de fuseau horaire, les chaînes UTF et Timezone seront définies. Ils seront identiques (en d'autres termes, l'UTF est réinitialisé dans la nouvelle zone lorsque vous sélectionnez une chaîne de fuseau horaire, timezone).

(WordPress 4)

1
Jeff

Il existe quelques options, dont aucune ne fonctionne vraiment bien. Il s’agit d’un bogue WordPress qui craint vraiment parce que le temps est mauvais, à moins que vous ne configuriez votre site en UTC ... ce qui est déroutant et pas toujours possible.

Je pense que ce code suivant ne fonctionne que si vous choisissez votre fuseau horaire (sous Paramètres -> Général dans admin) en tant que ville nommée plutôt que par un décalage de numéro GMT. Je n'ai pas testé cela, mais il est fort possible que get_option('gmt_offset') soit défini alors que get_option('timezone_string') ne l'est pas.

date_default_timezone_set(get_option('timezone_string'));

L'inconvénient est que WordPress suppose que PHP est défini sur UTC lors de la création des horodatages mysql. Vous pouvez donc modifier un peu votre base de données à chaque changement de fuseau horaire! Sans parler des autres plug-ins WP, vous pouvez supposer que l'environnement PHP est toujours au format UTC.

Donc, si vous voulez juste une heure correcte - vous pouvez forcer votre horodatage à être en UTC avec:

get_post_time('c', true); //should work for non-post objects.

Malheureusement, bien que correct, le fuseau horaire sera réglé sur UTC.

Et notez que vous ne pouvez pas both utiliser le drapeau "true" et la fonction timezone_set par défaut.

N'importe quelle solution correcte va être un fragment de code qui prend en compte gmt_offset ET timezone_string et les utilise pour définir un fuseau horaire pour certaines entrées. WP suppose que PHP est défini sur UTC lors de l'exécution de l'horodatage mysql, et cela pourrait endommager d'autres plug-ins.

Il existe une solution de ce type sur https://www.skyverge.com/blog/down-the-rabbit-hole-wordpress-and-timezones/ , mais, là encore, il s'agit d'un bogue, vous devez donc utiliser le code get_post_time($date_format, TRUE). pour obtenir un horodatage correct.

0
Ryan Taylor