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)
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() );
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 )
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.