si ho capito, ma il tuo calcolo diventa parecchio articolato.
cosa è che non funziona nel tuo codice? Onestamente provarlo per dirti ok e non ok non mi va (e non è lo scopo del forum).

l'algoritmo non è facile da scrivere (oltretutto lo hai anche scritto a metà):

1. le eccezioni sono solo per i mesi marzo/ottobre. Gli altri devi vedere se sei dopo marzo e prima di ottobre ora legale, prima marzo e dopo ottobre ora solare.
2. per marzo e ottobre: cerca l'ultima domenica del mese e in base a quello ti comporti di conseguenza.

Guarda

qui