Comment obtenir le réglage du fuseau horaire WordPress?

50

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.

utilisateur1462
la source

Réponses:

79

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

Bainternet
la source
6
Mon timezone_string est dans la base de données, mais il est vide, même après avoir sélectionné un fuseau horaire différent sur la page des paramètres. Quel pourrait être le cas? (WP3.6)
user2019515 le
Gmt_offest prend-il en compte l'heure d'été en fonction du fuseau horaire du site?
squarecandy
6
@ user2019515 Si vous choisissez une ville comme fuseau horaire, elle sera enregistrée dans l'option "timezone_string", mais si vous choisissez un décalage manuel (UTC + 1 par exemple), elle est enregistrée dans l'option "gmt_offset" (sous la forme "1") et par timezone_string. reste vide.
Berend
15

Malheureusement, il existe deux options différentes:

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

Mais dans les environnements les plus récents en timezone_stringréalité l' emporte gmt_offset , la valeur renvoyée par celle - ci sera basée sur l'ancien. Cependant, le contraire n'est pas vrai - gmt_offsetpeut être valable, alors que timezone_stringest vide.

J'ai passé pas mal de temps sur ces sujets, et la prise la plus récente que j'ai implémentée dans ma WpDateTimebibliothèque 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.

Rarst
la source
1
Cela devrait être la réponse acceptée. Les gens rencontreront des bogues s’ils se fient uniquement à get_option ('timezone_string').
DiscoInfiltrator
C'est la bonne réponse.
Lucas Bustamante
L'utilisation de (int)pour $ heures et floorde $ minutes ne pose-t-elle pas problème? Selon la documentation, (int)et floorsont presque les mêmes , sauf (int)arrondit -4,5 à -4 et floorva arrondir à -5. Cela semble donner des décalages de fuseau horaire négatifs incorrects?
Mikepote
1
@ Mikepote Oui, cela a été corrigé dans la bibliothèque il y a longtemps, il suffit de laisser une copie obsolète du code dans la réponse ici.
Rarst
Oh mon dieu, pourquoi l'ont-ils mis en œuvre comme ça ... Cela m'a coûté une inclinaison d'
Blackbam
9

Consultez la page de référence des options . L'option gmt_offsetrenvoie un entier. Par exemple, si le fuseau horaire est défini sur l'heure normale de l'Est (par exemple, America / New_York), gmt_offsetla valeur -5.

Travis Northcutt
la source
2

Ne pensez pas que vous obtiendrez une chaîne comme 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-à-dire EST ; 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.
 ?>
pommes d'or
la source
C'est inutile. Les normes de fuseau horaire font partie de PHP depuis la version 5.2, tout comme l’ objet DateTimeZone et les fonctions standard connexes.
haz
1

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

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 à sa valeur par défaut dans 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)

Jeff
la source
0

Il existe quelques options, dont aucune ne fonctionne vraiment bien. C'est un bug de WordPress, et ça craint vraiment parce que l'heure est fausse, sauf si vous définissez votre site sur UTC ... ce qui est déroutant et même 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) comme ville nommée plutôt que par un décalage de numéro GMT. Je n'ai pas testé cela, mais il est très possible que ce get_option('gmt_offset')soit réglé quand ce get_option('timezone_string')n'est pas le cas.

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 lorsque vous changez de fuseau horaire! Sans parler des autres plugins WP, on peut supposer que l'environnement PHP est toujours en 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 utiliser à la fois le drapeau "true" et la fonction timezone_set par défaut.

Toute solution appropriée va consister en un extrait de code qui prend en compte à la fois gmt_offsetAND timezone_stringet les utilise pour définir un fuseau horaire sur une entrée. WP suppose que PHP est défini sur UTC lors de l'exécution des horodatages mysql, et cela pourrait endommager d'autres plugins.

Une solution de ce type est disponible 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 get_post_time($date_format, TRUE)code pour obtenir un horodatage qui est en fait correct.

Ryan Taylor
la source
0

Etant donné que wordpress conserve la chaîne du fuseau horaire dans la table des options, vous pouvez utiliser la méthode orientée objet pour obtenir le bon moment sur votre site wordpress:

$tz = new DateTimeZone(get_option('timezone_string'));
$dt = new DateTime("now", $tz);

$page .= "<p> DateTime " . $dt->format("Y-m-d H:i:s") . "</p>";
Pål Bergquist
la source