get_datetime_with_timezone( $datetime_string ); if ( is_null( $date_time ) ) { return ''; } return $date_time->format( $format ); } /** * Get the datetime object, in site's time zone, if the datetime string was valid * * @param string $datetime_string The datetime string in UTC time zone, that needs to be converted to a DateTime object. * * @return DateTime|null in site's time zone */ public function get_datetime_with_timezone( $datetime_string ) { static $utc_timezone, $local_timezone; if ( ! isset( $utc_timezone ) ) { $utc_timezone = new DateTimeZone( 'UTC' ); $local_timezone = new DateTimeZone( $this->get_timezone_string() ); } if ( ! empty( $datetime_string ) && WPSEO_Utils::is_valid_datetime( $datetime_string ) ) { $datetime = new DateTime( $datetime_string, $utc_timezone ); $datetime->setTimezone( $local_timezone ); return $datetime; } return null; } /** * Returns the timezone string for a site, even if it's set to a UTC offset * * Adapted from http://www.php.net/manual/en/function.timezone-name-from-abbr.php#89155 * * @return string valid PHP timezone string */ private function determine_timezone_string() { // If site timezone string exists, return it. $timezone = get_option( 'timezone_string' ); if ( ! empty( $timezone ) ) { return $timezone; } // Get UTC offset, if it isn't set then return UTC. $utc_offset = (int) get_option( 'gmt_offset', 0 ); if ( 0 === $utc_offset ) { return 'UTC'; } // Adjust UTC offset from hours to seconds. $utc_offset *= HOUR_IN_SECONDS; // Attempt to guess the timezone string from the UTC offset. $timezone = timezone_name_from_abbr( '', $utc_offset ); if ( false !== $timezone ) { return $timezone; } // Last try, guess timezone string manually. $timezone_list = timezone_abbreviations_list(); foreach ( $timezone_list as $abbr ) { foreach ( $abbr as $city ) { if ( $city['offset'] === $utc_offset ) { return $city['timezone_id']; } } } // Fallback to UTC. return 'UTC'; } /** * Returns the correct timezone string * * @return string */ private function get_timezone_string() { if ( '' === $this->timezone_string ) { $this->timezone_string = $this->determine_timezone_string(); } return $this->timezone_string; } }