It can be done quite simply, by turning the offset into seconds and passing it to timezone_name_from_abbr
:
<?php
$offset="-7:00";
// Calculate seconds from offset
list($hours, $minutes) = explode(':', $offset);
$seconds = $hours * 60 * 60 + $minutes * 60;
// Get timezone name from seconds
$tz = timezone_name_from_abbr('', $seconds, 1);
// Workaround for bug #44780
if($tz === false) $tz = timezone_name_from_abbr('', $seconds, 0);
// Set timezone
date_default_timezone_set($tz);
echo $tz . ': ' . date('r');
The third parameter of timezone_name_from_abbr
controls whether to adjust for daylight saving time or not.
timezone_name_from_abbr() will return false on some time zone
offsets. In particular – Hawaii, which has a -10 from GMT offset, -36000
seconds.
References: