I need to use PHP’s DateTime()
. It’s currently displaying GMT time instead of the time that’s set for the timezone setting (EST) in the WordPress Admin.
How can this be converted to show the the time base
$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)
3 s
I’m not sure why EliasNS’ answer is marked correct, as far as I’m aware (and from the documentation), the second parameter of DateTime::__construct()
, if provided, should be a DateTimeZone
instance.
The problem then becomes, how we do we create a DateTimeZone
instance. This is easy if the user has selected a city as their timezone, but we can work around it if they have set an offset by using the (deprecated) Etc/GMT timezones.
/**
* 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;
}
Then you can use it as follows:
$time = new DateTime( null, wpse198435_get_blog_timezone() );