Your timezone doesn't change during daylight savings.
The rules that tell me what the time is in my timezone change, so the offset returned by $asctime (which is explicitly an offset from GMT) should change too. Wikipedia agrees with me on this
In my opinion it is pretty obvious that if $asctime returns "20:00:00 +0100 GMT
" and doing the math does not give me the current time in GMT
then it is wrong
$gmt is also faulty as it does not return GMT at all, but rather GMT + $daylight.
This is due to the fact that the offset doesn't necessarily have to be 1 hour (it could be 30 minutes, or 2 hours, or any other number in theory)
That's not relevant - your offset can still be a multiple of 30 minutes regardless of your current daylight saving offset.