Differences between revisions 14 and 15
Revision 14 as of 2006-05-29 09:33:34
Size: 8052
Editor: PeMac
Comment:
Revision 15 as of 2007-01-02 20:52:14
Size: 8180
Editor: ?GuillaumeBeaudoin
Comment: Mentions no compliance status of Woody
Deletions are marked like this. Additions are marked like this.
Line 6: Line 6:

The last version of glibc6 in Woody (2.2.5-11.8) '''does not''' include the new timezones for Autralias, the US nor Indiana.

Sometimes you need to change the [http://en.wikipedia.org/wiki/timezone timezone] files to cope with changes to your local legal environment, such as

  • in Australia when a state government decides to shift the start or end of daylight saving, or
  • in the US when the state of Indiana decided in 2006 to start using Daylight Saving Time for the first time in many decades, and at the same time some Indiana counties switched time zones (from Eastern to Central).

Debian includes timezone files in /usr/share/zoneinfo as part of the libc6 package. These files are updated eventually. For example, a libc6 update for Sarge, version 2.3.2.ds1-22sarge3, updates the timezone files to the tzdata2006b release (which includes the Australia and Indiana changes mentioned above). This libc6 package version was included in the Sarge [http://www.debian.org/News/2006/20060419 "r2"] update, released on April 19, 2006 (and had been available in [http://www.debian.org/releases/stable/errata#pointrelease "sarge-proposed-updates"] before r2 was officially released).

The last version of glibc6 in Woody (2.2.5-11.8) does not include the new timezones for Autralias, the US nor Indiana.

To make a change ahead of the change being made by the Debian project, follow this process:

  • run zdump to make sure the change is needed,

  • obtain an updated timezone source file, by download or patch,
  • run zic to make the change,

  • run zdump again to make sure the change is effective.

More detail below, using Sydney Australia as the example. Substitute the timezone name and the file name for your local environment.

Check If Needed

The zdump program dumps the timezone table. Use it to check the dates for the daylight savings change. For example this system has old Australian rules, showing a change from daylight saving on 26th March:

# zdump -c 2007 -v Australia/Sydney|grep 2006
Australia/Sydney  Sat Mar 25 15:59:59 2006 UTC = Sun Mar 26 02:59:59 2006 EST isdst=1 gmtoff=39600
Australia/Sydney  Sat Mar 25 16:00:00 2006 UTC = Sun Mar 26 02:00:00 2006 EST isdst=0 gmtoff=36000
Australia/Sydney  Sat Oct 28 15:59:59 2006 UTC = Sun Oct 29 01:59:59 2006 EST isdst=0 gmtoff=36000
Australia/Sydney  Sat Oct 28 16:00:00 2006 UTC = Sun Oct 29 03:00:00 2006 EST isdst=1 gmtoff=39600

If you are unsure which timezone your (Debian) computer is configured to use, check where /etc/localtime links to:

# ls -l /etc/localtime
lrwxrwxrwx    1 root     root           48 Mar 31 11:19 /etc/localtime -> /usr/share/zoneinfo/Australia/Sydney

and use the path following the "/usr/share/zoneinfo/" prefix. (If you discover the computer is in the wrong time zone, you can use the tzconfig command to change it.)

Get Timezone File

Obtain a copy of the australasia timezone file from either the libc6 sources or from the upstream site. If you are using the file from the source package without the change, then change the file adding the new lines for 2006. For example these lines are in the corrected file:

...
Rule    AN      2001    max     -       Oct     lastSun 2:00s   1:00    -
Rule    AN      2006    only    -       Apr     Sun>=1  2:00s   0       -
Rule    AN      2007    max     -       Mar     lastSun 2:00s   0       -
...

To get the australasia file from the libc6 sources, configure your sources.list with deb-src lines for your current distribution version, fetch the source, unpack it, and then edit the file. For example on a system tracking Sarge (version numbers may vary):

# apt-get install dpkg-dev
# apt-get source libc6
# cd glibc-2.3.2.ds1
# . prep.sh
# cp glibc-2.3.2/timezone/australasia /root
# cd /root
# vi australasia

Change

The zic program changes the timezone table. Give it the name of the australasia source file you changed. For example:

/usr/sbin/zic australasia

You can use the -d <directory> option to save the generated files somewhere other than /usr/share/zoneinfo (if you want to examine them before over-writing the system-wide files, for example).

Verify

Use the zdump program again to confirm the change. For example this system has the change properly applied, showing a change from daylight saving on 2nd April:

# zdump -c 2007 -v Australia/Sydney|grep 2006
Australia/Sydney  Sat Apr  1 15:59:59 2006 UTC = Sun Apr  2 02:59:59 2006 EST isdst=1 gmtoff=39600
Australia/Sydney  Sat Apr  1 16:00:00 2006 UTC = Sun Apr  2 02:00:00 2006 EST isdst=0 gmtoff=36000
Australia/Sydney  Sat Oct 28 15:59:59 2006 UTC = Sun Oct 29 01:59:59 2006 EST isdst=0 gmtoff=36000
Australia/Sydney  Sat Oct 28 16:00:00 2006 UTC = Sun Oct 29 03:00:00 2006 EST isdst=1 gmtoff=39600

Testing

While it isn't necessary to test since the zdump program above checks for discontinuities, it is possible to change your system's time so as to demonstrate the fix is good. There are side-effects of changing the time, such as distortion of file dates, or interoperability problems with other systems nearby, so it's only a good idea on a test system.

To do the test, use the date --utc command to change the time to just before the first discontinuity identified by zdump, then use the date command to show the local time, over the discontinuity. For example:

# date --utc 040115592006.50 ; date ; sleep 20 ; date
Sun Apr  2 02:59:50 EST 2006
Sun Apr  2 02:00:10 EST 2006

Note:

  • setting the time in UTC format using the --utc flag is helpful, because setting the time to 02:59:50 would be ambiguous and the date command takes it to mean the second 02:59:50 that morning rather than the first, and the rollover isn't seen to happen.

  • if you have NTP enabled, this might not work so well.

If this does not work, yet zdump looks fine, perhaps your system has an /etc/localtime file that is a copy of the zoneinfo file rather than a symlink to it. Debian GNU/Linux uses a symlink, but some other Linux distributions use a copy of the file.

You can also use the--date option to the date command see how the system will interpret a particular time without actually updating the system clock.

$ date --date="2006-04-01 15:59:50 utc"
Sun Apr  2 02:59:50 EST 2006
$ date --date="2006-04-01 16:00:10 utc"
Sun Apr  2 02:00:10 EST 2006

You can also point date to a specific zone file (such as one generated using zic -d <directory>)

$ TZ=/root/newtzdata/Australia/Sydney date --date="2006-04-01 16:00:10 utc"
Sun Apr  2 02:00:10 EST 2006

in order to test out zone files before installing them system-wide.

Restarting Daemons and Long-Running Programs

After the zoneinfo files are updated, you may need to restart daemons and other long-running programs to get them to use the new zone information. Examples of such programs include apache, bind, cron, fetchmail -d, inetd, mailman, sendmail, and sysklogd. A common symptom of this problem is seeing incorrect timestamps mixed in with the correct timestamps in your log files (e.g. /var/log/syslog). Even interactive programs like "mutt" may continue to use the old timezone information until they are restarted.

Binary Portability

The compiled zoneinfo file appears to be platform and architecture independent ... you may be able to move the file as-is without running zic, or just to pull updated zoneinfo files from a machine running a different Debian release.

References