Не полный ответ, только некоторые идеи, которые я мог бы придумать ... Метод DateTime :: format () принимает код формата, который сообщает, действует ли DST:
$now = new DateTime;
$is_dst = $now->format('I')==1;
Теперь, чтобы узнать, во сколько это было бы, если бы DST был наоборот, вы должны выяснить, когда такое изменение произойдет.Этот код:
$time_zone = $now->getTimeZone();
var_dump( $time_zone->getTransitions(strtotime('2011-01-01'), strtotime('2011-12-31')) );
... печатает:
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"
}
}
Если вы получаете переходы для года, к которому относится дата, вы можете собрать список смещений в соответствии с isdst TRUE иisdst ЛОЖЬ.Как только вы выберете подходящее смещение, все остальное легко:
$winter_offset = 3600;
$summer_offset = 7200;
$difference = $winter_offset-$summer_offset;
$winter = $now->modify( ($difference<0 ? '' : '+') . $difference . ' seconds');
echo $winter->format('H:i:s');