web-dev-qa-db-fra.com

Comment convertir DateTime () pour afficher l'heure en fonction du réglage du fuseau horaire de WordPress?

J'ai besoin d'utiliser DateTime() de PHP. Il affiche actuellement l'heure GMT au lieu de l'heure définie pour le réglage du fuseau horaire (EST) dans l'administrateur WordPress.

Comment cela peut-il être converti pour afficher la base de temps

$time = new DateTime();
echo $time->format("Y-m-d h:i:s");

// 2015-08-12 04:35:34 (gmt)
// 2015-08-12 12:35:34 (what i want -- EST)
5
user1462

Je ne suis pas sûr de savoir pourquoi la réponse d'EliasNS est marquée comme correcte, autant que je sache (et d'après documentation ), le deuxième paramètre de DateTime::__construct(), s'il est fourni, devrait être une instance DateTimeZone.

Le problème devient alors comment nous créons une instance DateTimeZone. Ceci est facile si l'utilisateur a sélectionné une ville comme fuseau horaire, mais nous pouvons le contourner s'il a défini un décalage à l'aide des fuseaux horaires (obsolète) Etc/GMT.

/**
 *  Returns the blog timezone
 *
 * Gets timezone settings from the db. If a timezone identifier is used just turns
 * it into a DateTimeZone. If an offset is used, it tries to find a suitable timezone.
 * If all else fails it uses UTC.
 *
 * @return DateTimeZone The blog timezone
 */
function wpse198435_get_blog_timezone() {

    $tzstring = get_option( 'timezone_string' );
    $offset   = get_option( 'gmt_offset' );

    //Manual offset...
    //@see http://us.php.net/manual/en/timezones.others.php
    //@see https://bugs.php.net/bug.php?id=45543
    //@see https://bugs.php.net/bug.php?id=45528
    //IANA timezone database that provides PHP's timezone support uses POSIX (i.e. reversed) style signs
    if( empty( $tzstring ) && 0 != $offset && floor( $offset ) == $offset ){
        $offset_st = $offset > 0 ? "-$offset" : '+'.absint( $offset );
        $tzstring  = 'Etc/GMT'.$offset_st;
    }

    //Issue with the timezone selected, set to 'UTC'
    if( empty( $tzstring ) ){
        $tzstring = 'UTC';
    }

    $timezone = new DateTimeZone( $tzstring );
    return $timezone; 
}

Ensuite, vous pouvez l'utiliser comme suit:

$time = new DateTime( null, wpse198435_get_blog_timezone() );
8
Stephen Harris

J’ai mis au point une méthode dans ma bibliothèque pour extraire le fuseau horaire de WP en tant qu’objet approprié: WpDateTimeZone::getWpTimezone() .

Alors que timezone_string est simple (c'est déjà un nom de fuseau horaire valide), gmt_offset est vilain. Le mieux que je puisse trouver est de le convertir au format +00:00:

$offset  = get_option( 'gmt_offset' );
$hours   = (int) $offset;
$minutes = ( $offset - floor( $offset ) ) * 60;
$offset  = sprintf( '%+03d:%02d', $hours, $minutes )
3
Rarst

DateTime aceppts un paramètre DateTimeZone, que vous pouvez obtenir à partir des options de WordPress. Quelque chose comme:

$time = new DateTime(NULL, get_option('gmt_offset'));

J'espère que cela t'aides.

Edit: Je le teste et j'obtiens une erreur. Je ne sais pas comment convertir le timezone string en un objet DateTimeZone, mais c'est ainsi.

0
EliasNS