The internal time on linux never changes, regardless your time zone settings.
The internal date/time can be presented to the user in a wide range of timezones. For instance,
miguel@gold:~> export TZ=Australia/Adelaide
Thu Mar 9 05:34:43 CST 2006
miguel@gold:~> export TZ=Brazil/East
Wed Mar 8 16:05:18 BRST 2006
There are several binary files on /usr/share/zoneinfo/ that tells to date command how to format the internal time and apply and corrections due the daylight savings rules for that time zone.
If none is fine for you, build your own. Read the zic(1) man page. It is the time zone compiler that will create a binary file zone info, from a text file you provide.
My text file for build a zone file for Brazil rules (which change every year btw) looks like this:
miguel@gold:~> cat /usr/local/etc/BrazilEast.zic
#Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
Rule BR 2001 only - Oct 14 0:00 1:00 D
Rule BR 2002 only - Feb 17 0:00 0:00 S
Rule BR 2002 only - Nov 03 0:00 1:00 D
Rule BR 2003 only - Feb 16 0:00 0:00 S
Rule BR 2003 only - Oct 19 0:00 1:00 D
Rule BR 2004 only - Feb 15 0:00 0:00 S
Rule BR 2004 only - Nov 02 0:00 1:00 D
Rule BR 2005 only - Feb 20 0:00 0:00 S
Rule BR 2005 only - Oct 16 0:00 1:00 D
Rule BR 2006 only - Feb 19 0:00 0:00 S
#Zone NAME GMTOFF RULES/SAVE FORMAT [UNTIL]
Zone Brazil/East -3:00 BR BR%sT
As you can see, last year the Brazil's daylight time started at Oct 16, and ends at Feb 19, this year.
When we are in Daylight saving time, the date command change the output to BRDT (where D stands for Daylight) and normal time is displayed as BRST (standard).
Just adapt my zic file for your needs, create the binary with the zic command. The resulting file will be placed by zic somewhere bellow /usr/share/zoneinfo/. The specific place is determined by the NAME field in the zic file, in my case, /usr/share/zoneinfo/Brazil/East.
After that, copy the binary file from /usr/share/zoneinfo to /etc/localtime and set somewhere in your system the default time zone (In SuSE is in /etc/sysconfig/clock).