This seems to work as expected, at least now:
<?php
$timezone1 = new \DateTimeZone('Europe/Sofia');
$timezone2 = new \DateTimeZone('UTC');
$sometime1 = '2014-03-30 02:59:59';
$sometime2 = '2014-03-30 03:00:00';
$date1 = new \DateTime($sometime1, $timezone1);
$date2 = new \DateTime($sometime2, $timezone1);
echo $date1->format('D M j, Y G:i:s T') . '<br>';
echo $date2->format('D M j, Y G:i:s T') . '<br>';
$date1->setTimezone($timezone1);
$date2->setTimezone($timezone1);
echo $date1->format('D M j, Y G:i:s T') . '<br>';
echo $date2->format('D M j, Y G:i:s T') . '<br>';
$date1->setTimezone($timezone2);
$date2->setTimezone($timezone2);
echo $date1->format('D M j, Y G:i:s T') . '<br>';
echo $date2->format('D M j, Y G:i:s T') . '<br>';
This outputs:
Sun Mar 30, 2014 2:59:59 EET
Sun Mar 30, 2014 4:00:00 EEST
Sun Mar 30, 2014 2:59:59 EET
Sun Mar 30, 2014 4:00:00 EEST
Sun Mar 30, 2014 0:59:59 UTC
Sun Mar 30, 2014 1:00:00 UTC