Not a full answer, just some ideas I could think of... The DateTime::format() method accepts a format code that tells whether DST is on effect:
$now = new DateTime;
$is_dst = $now->format('I')==1;
Now, in order to know what time it'd be if DST was the other way round, you have to find out when such change happens. This code:
$time_zone = $now->getTimeZone();
var_dump( $time_zone->getTransitions(strtotime('2011-01-01'), strtotime('2011-12-31')) );
... prints:
array(3) {
[0]=>
array(5) {
["ts"]=>
int(1293836400)
["time"]=>
string(24) "2010-12-31T23:00:00+0000"
["offset"]=>
int(3600)
["isdst"]=>
bool(false)
["abbr"]=>
string(3) "CET"
}
[1]=>
array(5) {
["ts"]=>
int(1301187600)
["time"]=>
string(24) "2011-03-27T01:00:00+0000"
["offset"]=>
int(7200)
["isdst"]=>
bool(true)
["abbr"]=>
string(4) "CEST"
}
[2]=>
array(5) {
["ts"]=>
int(1319936400)
["time"]=>
string(24) "2011-10-30T01:00:00+0000"
["offset"]=>
int(3600)
["isdst"]=>
bool(false)
["abbr"]=>
string(3) "CET"
}
}
If you obtain the transitions for year the date belongs to, you can collect a list of offsets according for isdst TRUE and isdst FALSE. Once you pick an appropriate offset, the rest is easy:
$winter_offset = 3600;
$summer_offset = 7200;
$difference = $winter_offset-$summer_offset;
$winter = $now->modify( ($difference<0 ? '' : '+') . $difference . ' seconds');
echo $winter->format('H:i:s');