[plug] Timezone

John Darrington j.darrington at student.murdoch.edu.au
Sat Jul 18 08:27:19 WST 1998

> okay, I did as I was told (linked Perth to localtime), but it still
> insists that i am standing in GMT rather than WST, although my date says
> Jul 17 19:23:23 WST, anyone have any other ideas?

Setting up time and time zones

There are several things involved in getting time right under Linux:

  - /usr/lib/zoneinfo contains files that define what time zone you
	are in.  If they are missing, no time zone calculations
	are done, i.e. your internal clock is assumed to be on
	local time rather than the Unix standard of GMT.  The only
	file that you absolutely need is /usr/lib/zoneinfo/localtime, but I
	recommend also having /usr/lib/zoneinfo/posixrules.  Posixrules
	is typically a copy of or link to localtime.  Localtime defines
	your default zone.  Posixrules is needed to interpret the TZ 
	variable, which is used if you want to specify a zone other than 
	the default.

  - the "date" command can be used to set or display the date/time.
	Note however that it does not set the hardware clock, so
	next time you reboot, you'll be back to the old time.
	I recommend that after changing the time with "date", you
	use "clock -w" or "clock -u -w" to update the hardware clock
	as well.  (See below.)

  - the "clock" command can be used to set or display the date/time
	in the hardware (CMOS) clock.  Typically your /etc/rc script
	will contain
		clock -s
	which will cause the Unix date/time to be initialized from the 
	CMOS clock when you boot.  If your CMOS clock is set to GMT
	(which is what I recommend) the correct command is
		clock -u -s

The binary time distribution should be untarred under /usr.  It
contains lib/zoneinfo, bin/date, bin/clock, and doc/time.doc (this
file).  Once you've installed these files, you'll want to do four

1) set /usr/lib/zoneinfo/localtime and /usr/lib/zoneinfo/posixrules.
You should copy the file for your time zone.  E.g. if you are in the
U.S.  Eastern time zone, do

   cd /usr/lib/zoneinfo
   cp US/Eastern localtime
   ln localtime posixrules

Localtime defines the local time zone.  Posixrules defines the zone to
be used to interpret the TZ environment variable.  Since it's far more
convenient simply to use the right time zone file, nothing more will
be said here about how the TZ variable is used.  Unless you intend to
use TZ, you can ignore the next paragraph.

If you want exact POSIX behavior, posixrules should be a copy of or
link to one of the U.S. time zone files.  (For non-U.S. daylight
rules, the TZ variable defines the daylight transition rules.)
However it may make more sense practically for it to be the same as
localtime, as shown in the instructions above.

2) Once you've set up localtime and posixrules, you can remove the
rest of the files in /usr/lib/zoneinfo, if you're sure you'll never
want to operate in any other time zone.  Or you can keep just the few
time zones that you might need.

3) Put the correct "clock" command into /etc/rc.  Which command to use
depends upon whether you want your hardware clock to keep local time
or GMT.  I recommend using GMT, since that will allow daylight savings
transitions to be completely automatic.  However the same clock is
used by DOS, and some people don't like the time in DOS being GMT.  I
use Unix-compatible software under DOS.  It uses the TZ environment
variable to do time zone conversion.  Thus I prefer the clock being
GMT even under DOS.  But some people may not like that.  Anyway, if
your hardware clock is set to the local time, put the line

   clock -s

in /etc/rc.  This will set the Unix time from your hardware clock,
doing the necessary time conversion.  If your hardware clock is set 
to GMT, then you'll need the -u option:

   clock -u -s

4) Now make sure that your hardware clock is set correctly.  Try
"clock" with no arguments.  It will print the current setting of the
hardware clock.  Make sure it is right, and that it is either local or
GMT, as you decided.  (If the hardware clock is supposed to be GMT,
you can use "clock -u".  This will convert from GMT to local and
display it.)  To set the clock, first use the "date" command to get
the date right in Unix.  Then use "clock -w" to set the hardware
clock.  Note that "clock -w" will set the hardware clock to the local
time, and "clock -u -w" will set it to GMT.  Verify with "clock" that
the hardware clock is as you want it.

More information about the plug mailing list