HP OpenVMS Systems

ask the wizard
Content starts here

TDF, localtime, daylight savings, and timezones?

» close window

The Question is:

 
The C langage localtime returns a time that is one hour off.
 
$ cc/noopt/deb t
$ lin t/deb
$ run t
 
         OpenVMS Alpha Debug64 Version V7.2-019
~stepped through code
 
DBG> type 1940:1946
module T
  1940: main()
  1941: {
  1942:  tm_t *z;   time_t t;
  1943:    t = time(0);
  1944:    z=localtime(&t);
  1945:    return;
  1946: }
DBG> exam @z
*T\main\z
    tm_sec:     58
    tm_min:     16
    tm_hour:    14 <== Note that time is one hour off
    tm_mday:    7
    tm_mon:     11
    tm_year:    99
    tm_wday:    2
    tm_yday:    340
    tm_isdst:   0
    tm_gmtoff:  -28800
    tm_zone:    2315912
DBG>  Exit
$ show time
   7-DEC-1999 15:17:51
 
$ cc/version
DEC C V6.0-001 on OpenVMS Alpha V7.2
 
$ sh log/sys  *time*
 
(LNM$SYSTEM_TABLE)
 
  "SYS$LOCALTIME" = "SYS$SYSROOT:[SYS$ZONEINFO.SYSTEM.US]PACIFIC."
  "SYS$TIMEZONE_DAYLIGHT_SAVING" = "1"
  "SYS$TIMEZONE_DIFFERENTIAL" = "-25200"
  "SYS$TIMEZONE_NAME" = "PDT"
  "SYS$TIMEZONE_RULE" = "PST8PDT7,M4.1.0/2,M10.5.0/2"
  "TCPIP$BIND_TIMEOUT" = "...."
  "TCPIP$CFS_ATTR_CACHE_TIMEOUT" = "5"
 
 


The Answer is :

 
  The setting of the tm_isdst field clearly indicates that the system
  had determined that daylight savings time (DST) is not in effect, and
  thus that the current time is Standard Time.
 
  Now, as to why this has occured...
 
  The localtime() function was given the correct UTC.  The localtime()
  function itself knows exactly nothing about the OpenVMS UTC system
  services, the timezone differential factor (TDF), and other OpenVMS
  system-specific creatures.  What it does know about are the rules in
  the timezone file.  According to the timezone rules, the month of
  December is Standard Time.  While mapping a given UTC time to the
  local time, the localtime() function applied the offset for Standard
  Time and returned the correct Standard Time corresponding to the
  correct UTC time returned by the time() function.  Of course, this
  correct Standard Time was one hour off from the phony DST time on
  the system.
 

answer written or last revised on ( 8-DEC-1999 )

» close window