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.