Yes, there are many moving parts to time/date calculations!
I personally always use gmtime(), which is close to utc time.
There is a slight difference between gm and utc time, but not much.
The difference is so small that I don't want to argue about it.
I recommend using GM or UTC time for all values stored in a DB.
Use a a conversion module like Time::Piece for translation to
translate the DB time to a user time zone.
My local government had a problem with the fall time change.
This actually allowed bars to remain open for one extra hour on one
day of the year.
They fixed that "problem".
gmtime() just marches onward- there is no "fall back".