Wordpress - How to convert DateTime() to display time based on WordPress timezone setting?

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

I had developed a method in my lib to retrieve current WP’s time zone as proper object: WpDateTimeZone::getWpTimezone().

While timezone_string is straightforward (it is already a valid time zone name), gmt_offset case is nasty. Best I could come up with is converting it into a +00:00 format:

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